This is an automated email from the ASF dual-hosted git repository.

zhangzc pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-gluten.git


The following commit(s) were added to refs/heads/main by this push:
     new 82d182c592 [GLUTEN-8846][CH][Part 2] Add the test case for the iceberg 
MOR table with the equality deletion and the position deletion (#8992)
82d182c592 is described below

commit 82d182c59271dcb64f8c592d22f7a6478efb2385
Author: Zhichao Zhang <[email protected]>
AuthorDate: Fri Mar 14 18:49:19 2025 +0800

    [GLUTEN-8846][CH][Part 2] Add the test case for the iceberg MOR table with 
the equality deletion and the position deletion (#8992)
    
    [CH][Part 2] Add the test case for the iceberg MOR table with the equality 
deletion and the position deletion:
    1. ClickHouseIcebergMOREqualityDeletionSuite.scala for the equality 
deletion, the test table was generated by the Flink + Iceberg
    2. ClickHouseIcebergSuite.scala for the position deletion
---
 ...ClickHouseIcebergMOREqualityDeletionSuite.scala |  73 +++++++
 .../execution/iceberg/ClickHouseIcebergSuite.scala | 227 +++++++++++++++++++--
 ...6-db12-4e82-b7c7-ab4adfa40de9-00001.parquet.crc | Bin 0 -> 16 bytes
 ...6-db12-4e82-b7c7-ab4adfa40de9-00002.parquet.crc | Bin 0 -> 12 bytes
 ...c-e03e-4709-b9fc-f7ef771a7c19-00001.parquet.crc | Bin 0 -> 16 bytes
 ...c-e03e-4709-b9fc-f7ef771a7c19-00002.parquet.crc | Bin 0 -> 12 bytes
 ...ee376-db12-4e82-b7c7-ab4adfa40de9-00001.parquet | Bin 0 -> 917 bytes
 ...ee376-db12-4e82-b7c7-ab4adfa40de9-00002.parquet | Bin 0 -> 440 bytes
 ...9cf6c-e03e-4709-b9fc-f7ef771a7c19-00001.parquet | Bin 0 -> 904 bytes
 ...9cf6c-e03e-4709-b9fc-f7ef771a7c19-00002.parquet | Bin 0 -> 448 bytes
 ...5f5d7ba-1dad-42be-9a6a-fb30179fd803-m0.avro.crc | Bin 0 -> 64 bytes
 ...5f5d7ba-1dad-42be-9a6a-fb30179fd803-m1.avro.crc | Bin 0 -> 64 bytes
 ...667f02f-4d6c-4a67-bf20-4aec7179400a-m0.avro.crc | Bin 0 -> 64 bytes
 ...667f02f-4d6c-4a67-bf20-4aec7179400a-m1.avro.crc | Bin 0 -> 64 bytes
 ...1-7667f02f-4d6c-4a67-bf20-4aec7179400a.avro.crc | Bin 0 -> 44 bytes
 ...1-55f5d7ba-1dad-42be-9a6a-fb30179fd803.avro.crc | Bin 0 -> 44 bytes
 .../metadata/.v1.metadata.json.crc                 | Bin 0 -> 20 bytes
 .../metadata/.v2.metadata.json.crc                 | Bin 0 -> 32 bytes
 .../metadata/.v3.metadata.json.crc                 | Bin 0 -> 40 bytes
 .../metadata/.version-hint.text.crc                | Bin 0 -> 12 bytes
 .../55f5d7ba-1dad-42be-9a6a-fb30179fd803-m0.avro   | Bin 0 -> 6794 bytes
 .../55f5d7ba-1dad-42be-9a6a-fb30179fd803-m1.avro   | Bin 0 -> 6765 bytes
 .../7667f02f-4d6c-4a67-bf20-4aec7179400a-m0.avro   | Bin 0 -> 6797 bytes
 .../7667f02f-4d6c-4a67-bf20-4aec7179400a-m1.avro   | Bin 0 -> 6766 bytes
 ...257-1-7667f02f-4d6c-4a67-bf20-4aec7179400a.avro | Bin 0 -> 4352 bytes
 ...384-1-55f5d7ba-1dad-42be-9a6a-fb30179fd803.avro | Bin 0 -> 4268 bytes
 .../db/test_upsert_query/metadata/v1.metadata.json |  53 +++++
 .../db/test_upsert_query/metadata/v2.metadata.json |  89 ++++++++
 .../db/test_upsert_query/metadata/v3.metadata.json | 121 +++++++++++
 .../test_upsert_query/metadata/version-hint.text   |   1 +
 30 files changed, 544 insertions(+), 20 deletions(-)

diff --git 
a/backends-clickhouse/src-iceberg/test/scala/org/apache/gluten/execution/iceberg/ClickHouseIcebergMOREqualityDeletionSuite.scala
 
b/backends-clickhouse/src-iceberg/test/scala/org/apache/gluten/execution/iceberg/ClickHouseIcebergMOREqualityDeletionSuite.scala
new file mode 100644
index 0000000000..17a2c991ff
--- /dev/null
+++ 
b/backends-clickhouse/src-iceberg/test/scala/org/apache/gluten/execution/iceberg/ClickHouseIcebergMOREqualityDeletionSuite.scala
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.gluten.execution.iceberg
+
+import org.apache.commons.io.FileUtils
+import 
org.apache.gluten.execution.{GlutenClickHouseWholeStageTransformerSuite, 
IcebergScanTransformer}
+import org.apache.spark.SparkConf
+
+import java.io.File
+
+class ClickHouseIcebergMOREqualityDeletionSuite extends 
GlutenClickHouseWholeStageTransformerSuite {
+
+  protected val ICEBERG_GENERATED_PATH = "junit6640909127060857423"
+  protected val ICEBERG_WAREHOUSE = s"/tmp/$ICEBERG_GENERATED_PATH"
+  protected val equalityDeletedDataPath: String =
+    "../../../../gluten-iceberg/src-iceberg/test/resources"
+
+  override protected def sparkConf: SparkConf = {
+    super.sparkConf
+      .set("spark.shuffle.manager", 
"org.apache.spark.shuffle.sort.ColumnarShuffleManager")
+      .set("spark.sql.adaptive.enabled", "true")
+      .set("spark.sql.shuffle.partitions", "2")
+      .set("spark.memory.offHeap.size", "2g")
+      .set("spark.unsafe.exceptionOnMemoryLeak", "true")
+      .set("spark.sql.autoBroadcastJoinThreshold", "-1")
+      .set(
+        "spark.sql.extensions",
+        "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
+      .set("spark.sql.catalog.local", "org.apache.iceberg.spark.SparkCatalog")
+      .set("spark.sql.catalog.local.type", "hadoop")
+      .set("spark.sql.catalog.local.warehouse", 
s"file://$ICEBERG_WAREHOUSE/default")
+  }
+
+  override def beforeAll(): Unit = {
+    super.beforeAll()
+
+    val icebergPathDir = new File(ICEBERG_WAREHOUSE)
+    if (icebergPathDir.exists()) {
+      FileUtils.forceDelete(icebergPathDir)
+    }
+    FileUtils.forceMkdir(icebergPathDir)
+    val equalityDeletedData =
+      new File(s"$rootPath$equalityDeletedDataPath/$ICEBERG_GENERATED_PATH")
+    FileUtils.copyDirectory(equalityDeletedData, icebergPathDir)
+  }
+
+  testWithSpecifiedSparkVersion(
+    "iceberg read mor table with equality deletion", Array("3.3", "3.5")) {
+    // The table 'test_upsert_query' was generated by Flink + Iceberg from the 
iceberg ut,
+    // the root path must be the '/tmp/junit6640909127060857423/default'
+    val testTableName = "local.db.test_upsert_query"
+    runQueryAndCompare(
+      s"""
+        |select * from $testTableName;
+        |""".stripMargin) {
+      checkGlutenOperatorMatch[IcebergScanTransformer]
+    }
+  }
+}
diff --git 
a/backends-clickhouse/src-iceberg/test/scala/org/apache/gluten/execution/iceberg/ClickHouseIcebergSuite.scala
 
b/backends-clickhouse/src-iceberg/test/scala/org/apache/gluten/execution/iceberg/ClickHouseIcebergSuite.scala
index 38c1e606cb..3e44047b74 100644
--- 
a/backends-clickhouse/src-iceberg/test/scala/org/apache/gluten/execution/iceberg/ClickHouseIcebergSuite.scala
+++ 
b/backends-clickhouse/src-iceberg/test/scala/org/apache/gluten/execution/iceberg/ClickHouseIcebergSuite.scala
@@ -222,6 +222,166 @@ class ClickHouseIcebergSuite extends 
GlutenClickHouseWholeStageTransformerSuite
     }
   }
 
+  testWithSpecifiedSparkVersion("iceberg bucketed join partition value not 
exists",
+    Array("3.4", "3.5")) {
+    val leftTable = "p_str_tb"
+    val rightTable = "p_int_tb"
+    withTable(leftTable, rightTable) {
+      withSQLConf(GlutenConfig.GLUTEN_ENABLED.key -> "false") {
+        // Gluten does not support write iceberg table.
+        spark.sql(
+          s"""
+             |create table $leftTable(id int, name string, p string)
+             |using iceberg
+             |partitioned by (bucket(4, id));
+             |""".stripMargin)
+        spark.sql(
+          s"""
+             |insert into table $leftTable values
+             |(4, 'a5', 'p4'),
+             |(1, 'a1', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(2, 'a3', 'p2'),
+             |(1, 'a2', 'p1'),
+             |(3, 'a4', 'p3'),
+             |(10, 'a4', 'p3');
+             |""".stripMargin
+        )
+        spark.sql(
+          s"""
+             |create table $rightTable(id int, name string, p int)
+             |using iceberg
+             |partitioned by (bucket(4, id));
+             |""".stripMargin)
+        spark.sql(
+          s"""
+             |insert into table $rightTable values
+             |(3, 'b4', 23),
+             |(1, 'b1', 21);
+             |""".stripMargin
+        )
+      }
+
+      withSQLConf(
+        "spark.sql.sources.v2.bucketing.enabled" -> "true",
+        "spark.sql.requireAllClusterKeysForCoPartition" -> "false",
+        "spark.sql.adaptive.enabled" -> "false",
+        "spark.sql.iceberg.planning.preserve-data-grouping" -> "true",
+        "spark.sql.autoBroadcastJoinThreshold" -> "-1",
+        "spark.sql.sources.v2.bucketing.pushPartValues.enabled" -> "true",
+        
"spark.sql.sources.v2.bucketing.partiallyClusteredDistribution.enabled" -> 
"false"
+      ) {
+        runQueryAndCompare(
+          s"""
+             |select s.id, s.name, i.name, i.p
+             | from $leftTable s inner join $rightTable i
+             | on s.id = i.id;
+             |""".stripMargin) {
+          df => {
+            assert(
+              getExecutedPlan(df).count(
+                plan => {
+                  plan.isInstanceOf[IcebergScanTransformer]
+                }) == 2)
+            getExecutedPlan(df).map {
+              case plan: IcebergScanTransformer =>
+                assert(plan.getKeyGroupPartitioning.isDefined)
+                assert(plan.getSplitInfosWithIndex.length == 3)
+              case _ => // do nothing
+            }
+          }
+        }
+      }
+    }
+  }
+
+  testWithSpecifiedSparkVersion(
+    "iceberg bucketed join partition value not exists partial cluster", 
Array("3.4", "3.5")) {
+    val leftTable = "p_str_tb"
+    val rightTable = "p_int_tb"
+    withTable(leftTable, rightTable) {
+      withSQLConf(GlutenConfig.GLUTEN_ENABLED.key -> "false") {
+        // Gluten does not support write iceberg table.
+        spark.sql(
+          s"""
+             |create table $leftTable(id int, name string, p string)
+             |using iceberg
+             |partitioned by (bucket(4, id));
+             |""".stripMargin)
+        spark.sql(
+          s"""
+             |insert into table $leftTable values
+             |(4, 'a5', 'p4'),
+             |(1, 'a1', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(1, 'a2', 'p1'),
+             |(2, 'a3', 'p2'),
+             |(1, 'a2', 'p1'),
+             |(3, 'a4', 'p3'),
+             |(10, 'a4', 'p3');
+             |""".stripMargin
+        )
+        spark.sql(
+          s"""
+             |create table $rightTable(id int, name string, p int)
+             |using iceberg
+             |partitioned by (bucket(4, id));
+             |""".stripMargin)
+        spark.sql(
+          s"""
+             |insert into table $rightTable values
+             |(3, 'b4', 23),
+             |(1, 'b1', 21);
+             |""".stripMargin
+        )
+      }
+
+      withSQLConf(
+        "spark.sql.sources.v2.bucketing.enabled" -> "true",
+        "spark.sql.requireAllClusterKeysForCoPartition" -> "false",
+        "spark.sql.adaptive.enabled" -> "false",
+        "spark.sql.iceberg.planning.preserve-data-grouping" -> "true",
+        "spark.sql.autoBroadcastJoinThreshold" -> "-1",
+        "spark.sql.sources.v2.bucketing.pushPartValues.enabled" -> "true",
+        
"spark.sql.sources.v2.bucketing.partiallyClusteredDistribution.enabled" -> 
"true"
+      ) {
+        runQueryAndCompare(
+          s"""
+             |select s.id, s.name, i.name, i.p
+             | from $leftTable s inner join $rightTable i
+             | on s.id = i.id;
+             |""".stripMargin) {
+          df => {
+            assert(
+              getExecutedPlan(df).count(
+                plan => {
+                  plan.isInstanceOf[IcebergScanTransformer]
+                }) == 2)
+            getExecutedPlan(df).map {
+              case plan: IcebergScanTransformer =>
+                assert(plan.getKeyGroupPartitioning.isDefined)
+                assert(plan.getSplitInfosWithIndex.length == 3)
+              case _ => // do nothing
+            }
+          }
+        }
+      }
+    }
+  }
+
   testWithSpecifiedSparkVersion(
     "iceberg bucketed join with partition filter", Array("3.3", "3.5")) {
     val leftTable = "p_str_tb"
@@ -348,12 +508,12 @@ class ClickHouseIcebergSuite extends 
GlutenClickHouseWholeStageTransformerSuite
     }
   }
 
-  test("iceberg read mor table - delete and update") {
-    withTable("iceberg_mor_tb") {
+  test("iceberg read cow table - delete and update") {
+    withTable("iceberg_cow_tb") {
       withSQLConf(GlutenConfig.GLUTEN_ENABLED.key -> "false") {
         spark.sql(
           """
-            |create table iceberg_mor_tb (
+            |create table iceberg_cow_tb (
             |  id int,
             |  name string,
             |  p string
@@ -367,7 +527,7 @@ class ClickHouseIcebergSuite extends 
GlutenClickHouseWholeStageTransformerSuite
         // Insert some test rows.
         spark.sql(
           """
-            |insert into table iceberg_mor_tb
+            |insert into table iceberg_cow_tb
             |values (1, 'a1', 'p1'), (2, 'a2', 'p1'), (3, 'a3', 'p2'),
             |       (4, 'a4', 'p1'), (5, 'a5', 'p2'), (6, 'a6', 'p1');
             |""".stripMargin)
@@ -375,33 +535,32 @@ class ClickHouseIcebergSuite extends 
GlutenClickHouseWholeStageTransformerSuite
         // Delete row.
         spark.sql(
           """
-            |delete from iceberg_mor_tb where name = 'a1';
+            |delete from iceberg_cow_tb where name = 'a1';
             |""".stripMargin
         )
         // Update row.
         spark.sql(
           """
-            |update iceberg_mor_tb set name = 'new_a2' where id = 'a2';
+            |update iceberg_cow_tb set name = 'new_a2' where id = 'a2';
             |""".stripMargin
         )
         // Delete row again.
         spark.sql(
           """
-            |delete from iceberg_mor_tb where id = 6;
+            |delete from iceberg_cow_tb where id = 6;
             |""".stripMargin
         )
       }
       runQueryAndCompare(
         """
-          |select * from iceberg_mor_tb;
+          |select * from iceberg_cow_tb;
           |""".stripMargin) {
         checkGlutenOperatorMatch[IcebergScanTransformer]
       }
     }
   }
 
-  // TODO: support merge-on-read mode
-  ignore("iceberg read mor table - delete and update with merge-on-read mode") 
{
+  test("iceberg read mor table - delete and update") {
     withTable("iceberg_mor_tb") {
       withSQLConf(GlutenConfig.GLUTEN_ENABLED.key -> "false") {
         spark.sql(
@@ -456,12 +615,12 @@ class ClickHouseIcebergSuite extends 
GlutenClickHouseWholeStageTransformerSuite
     }
   }
 
-  test("iceberg read mor table - merge into") {
-    withTable("iceberg_mor_tb", "merge_into_source_tb") {
+  test("iceberg read cow table - merge into") {
+    withTable("iceberg_cow_tb", "merge_into_source_tb") {
       withSQLConf(GlutenConfig.GLUTEN_ENABLED.key -> "false") {
         spark.sql(
           """
-            |create table iceberg_mor_tb (
+            |create table iceberg_cow_tb (
             |  id int,
             |  name string,
             |  p string
@@ -483,7 +642,7 @@ class ClickHouseIcebergSuite extends 
GlutenClickHouseWholeStageTransformerSuite
         // Insert some test rows.
         spark.sql(
           """
-            |insert into table iceberg_mor_tb
+            |insert into table iceberg_cow_tb
             |values (1, 'a1', 'p1'), (2, 'a2', 'p1'), (3, 'a3', 'p2');
             |""".stripMargin)
         spark.sql(
@@ -496,20 +655,20 @@ class ClickHouseIcebergSuite extends 
GlutenClickHouseWholeStageTransformerSuite
         // Delete row.
         spark.sql(
           """
-            |delete from iceberg_mor_tb where name = 'a1';
+            |delete from iceberg_cow_tb where name = 'a1';
             |""".stripMargin
         )
         // Update row.
         spark.sql(
           """
-            |update iceberg_mor_tb set name = 'new_a2' where id = 'a2';
+            |update iceberg_cow_tb set name = 'new_a2' where id = 'a2';
             |""".stripMargin
         )
 
         // Merge into.
         spark.sql(
           """
-            |merge into iceberg_mor_tb t
+            |merge into iceberg_cow_tb t
             |using (select * from merge_into_source_tb) s
             |on t.id = s.id
             |when matched then
@@ -521,15 +680,14 @@ class ClickHouseIcebergSuite extends 
GlutenClickHouseWholeStageTransformerSuite
       }
       runQueryAndCompare(
         """
-          |select * from iceberg_mor_tb;
+          |select * from iceberg_cow_tb;
           |""".stripMargin) {
         checkGlutenOperatorMatch[IcebergScanTransformer]
       }
     }
   }
 
-  // TODO: support merge-on-read mode
-  ignore("iceberg read mor table - merge into with merge-on-read mode") {
+  test("iceberg read mor table - merge into with merge-on-read mode") {
     withTable("iceberg_mor_tb", "merge_into_source_tb") {
       withSQLConf(GlutenConfig.GLUTEN_ENABLED.key -> "false") {
         spark.sql(
@@ -637,4 +795,33 @@ class ClickHouseIcebergSuite extends 
GlutenClickHouseWholeStageTransformerSuite
         }
     }
   }
+
+  test("test read v1 iceberg with partition drop") {
+    val testTable = "test_table_with_partition"
+    withTable(testTable) {
+      spark.sql(
+        s"""
+           |CREATE TABLE $testTable (id INT, data STRING, p1 STRING, p2 STRING)
+           |USING iceberg
+           |tblproperties (
+           |  'format-version' = '1'
+           |)
+           |PARTITIONED BY (p1, p2);
+           |""".stripMargin)
+      spark.sql(
+        s"""
+           |INSERT INTO $testTable VALUES
+           |(1, 'test_data', 'test_p1', 'test_p2');
+           |""".stripMargin)
+      spark.sql(
+        s"""
+           |ALTER TABLE $testTable DROP PARTITION FIELD p2
+           |""".stripMargin)
+      val resultDf = spark.sql(s"SELECT id, data, p1, p2 FROM $testTable")
+      val result = resultDf.collect()
+
+      assert(result.length == 1)
+      assert(result.head.getString(3) == "test_p2")
+    }
+  }
 }
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/.00000-0-5dbee376-db12-4e82-b7c7-ab4adfa40de9-00001.parquet.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/.00000-0-5dbee376-db12-4e82-b7c7-ab4adfa40de9-00001.parquet.crc
new file mode 100644
index 0000000000..4d30e8c263
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/.00000-0-5dbee376-db12-4e82-b7c7-ab4adfa40de9-00001.parquet.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/.00000-0-5dbee376-db12-4e82-b7c7-ab4adfa40de9-00002.parquet.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/.00000-0-5dbee376-db12-4e82-b7c7-ab4adfa40de9-00002.parquet.crc
new file mode 100644
index 0000000000..e53b37a216
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/.00000-0-5dbee376-db12-4e82-b7c7-ab4adfa40de9-00002.parquet.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/.00000-0-6bd9cf6c-e03e-4709-b9fc-f7ef771a7c19-00001.parquet.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/.00000-0-6bd9cf6c-e03e-4709-b9fc-f7ef771a7c19-00001.parquet.crc
new file mode 100644
index 0000000000..10cf58cf07
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/.00000-0-6bd9cf6c-e03e-4709-b9fc-f7ef771a7c19-00001.parquet.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/.00000-0-6bd9cf6c-e03e-4709-b9fc-f7ef771a7c19-00002.parquet.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/.00000-0-6bd9cf6c-e03e-4709-b9fc-f7ef771a7c19-00002.parquet.crc
new file mode 100644
index 0000000000..dcbbbe566e
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/.00000-0-6bd9cf6c-e03e-4709-b9fc-f7ef771a7c19-00002.parquet.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/00000-0-5dbee376-db12-4e82-b7c7-ab4adfa40de9-00001.parquet
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/00000-0-5dbee376-db12-4e82-b7c7-ab4adfa40de9-00001.parquet
new file mode 100644
index 0000000000..9374a747e0
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/00000-0-5dbee376-db12-4e82-b7c7-ab4adfa40de9-00001.parquet
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/00000-0-5dbee376-db12-4e82-b7c7-ab4adfa40de9-00002.parquet
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/00000-0-5dbee376-db12-4e82-b7c7-ab4adfa40de9-00002.parquet
new file mode 100644
index 0000000000..260c9eb19d
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/00000-0-5dbee376-db12-4e82-b7c7-ab4adfa40de9-00002.parquet
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/00000-0-6bd9cf6c-e03e-4709-b9fc-f7ef771a7c19-00001.parquet
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/00000-0-6bd9cf6c-e03e-4709-b9fc-f7ef771a7c19-00001.parquet
new file mode 100644
index 0000000000..a3ae6a6dfc
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/00000-0-6bd9cf6c-e03e-4709-b9fc-f7ef771a7c19-00001.parquet
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/00000-0-6bd9cf6c-e03e-4709-b9fc-f7ef771a7c19-00002.parquet
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/00000-0-6bd9cf6c-e03e-4709-b9fc-f7ef771a7c19-00002.parquet
new file mode 100644
index 0000000000..a653c4e61d
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/data/00000-0-6bd9cf6c-e03e-4709-b9fc-f7ef771a7c19-00002.parquet
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.55f5d7ba-1dad-42be-9a6a-fb30179fd803-m0.avro.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.55f5d7ba-1dad-42be-9a6a-fb30179fd803-m0.avro.crc
new file mode 100644
index 0000000000..31e3440b7b
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.55f5d7ba-1dad-42be-9a6a-fb30179fd803-m0.avro.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.55f5d7ba-1dad-42be-9a6a-fb30179fd803-m1.avro.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.55f5d7ba-1dad-42be-9a6a-fb30179fd803-m1.avro.crc
new file mode 100644
index 0000000000..f44fdfd54c
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.55f5d7ba-1dad-42be-9a6a-fb30179fd803-m1.avro.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.7667f02f-4d6c-4a67-bf20-4aec7179400a-m0.avro.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.7667f02f-4d6c-4a67-bf20-4aec7179400a-m0.avro.crc
new file mode 100644
index 0000000000..b5248118f9
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.7667f02f-4d6c-4a67-bf20-4aec7179400a-m0.avro.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.7667f02f-4d6c-4a67-bf20-4aec7179400a-m1.avro.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.7667f02f-4d6c-4a67-bf20-4aec7179400a-m1.avro.crc
new file mode 100644
index 0000000000..591b07dbee
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.7667f02f-4d6c-4a67-bf20-4aec7179400a-m1.avro.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.snap-6031039455377193257-1-7667f02f-4d6c-4a67-bf20-4aec7179400a.avro.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.snap-6031039455377193257-1-7667f02f-4d6c-4a67-bf20-4aec7179400a.avro.crc
new file mode 100644
index 0000000000..f3a0cfed2d
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.snap-6031039455377193257-1-7667f02f-4d6c-4a67-bf20-4aec7179400a.avro.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.snap-8248577847462459384-1-55f5d7ba-1dad-42be-9a6a-fb30179fd803.avro.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.snap-8248577847462459384-1-55f5d7ba-1dad-42be-9a6a-fb30179fd803.avro.crc
new file mode 100644
index 0000000000..55b24b4db4
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.snap-8248577847462459384-1-55f5d7ba-1dad-42be-9a6a-fb30179fd803.avro.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.v1.metadata.json.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.v1.metadata.json.crc
new file mode 100644
index 0000000000..1506df72b9
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.v1.metadata.json.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.v2.metadata.json.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.v2.metadata.json.crc
new file mode 100644
index 0000000000..d4d5366c10
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.v2.metadata.json.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.v3.metadata.json.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.v3.metadata.json.crc
new file mode 100644
index 0000000000..b4a057d627
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.v3.metadata.json.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.version-hint.text.crc
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.version-hint.text.crc
new file mode 100644
index 0000000000..65f9819238
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/.version-hint.text.crc
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/55f5d7ba-1dad-42be-9a6a-fb30179fd803-m0.avro
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/55f5d7ba-1dad-42be-9a6a-fb30179fd803-m0.avro
new file mode 100644
index 0000000000..d99fcbcce9
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/55f5d7ba-1dad-42be-9a6a-fb30179fd803-m0.avro
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/55f5d7ba-1dad-42be-9a6a-fb30179fd803-m1.avro
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/55f5d7ba-1dad-42be-9a6a-fb30179fd803-m1.avro
new file mode 100644
index 0000000000..815a883f8f
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/55f5d7ba-1dad-42be-9a6a-fb30179fd803-m1.avro
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/7667f02f-4d6c-4a67-bf20-4aec7179400a-m0.avro
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/7667f02f-4d6c-4a67-bf20-4aec7179400a-m0.avro
new file mode 100644
index 0000000000..2ce63d969b
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/7667f02f-4d6c-4a67-bf20-4aec7179400a-m0.avro
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/7667f02f-4d6c-4a67-bf20-4aec7179400a-m1.avro
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/7667f02f-4d6c-4a67-bf20-4aec7179400a-m1.avro
new file mode 100644
index 0000000000..e6191207c3
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/7667f02f-4d6c-4a67-bf20-4aec7179400a-m1.avro
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/snap-6031039455377193257-1-7667f02f-4d6c-4a67-bf20-4aec7179400a.avro
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/snap-6031039455377193257-1-7667f02f-4d6c-4a67-bf20-4aec7179400a.avro
new file mode 100644
index 0000000000..4817c65be9
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/snap-6031039455377193257-1-7667f02f-4d6c-4a67-bf20-4aec7179400a.avro
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/snap-8248577847462459384-1-55f5d7ba-1dad-42be-9a6a-fb30179fd803.avro
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/snap-8248577847462459384-1-55f5d7ba-1dad-42be-9a6a-fb30179fd803.avro
new file mode 100644
index 0000000000..b9fd0ece61
Binary files /dev/null and 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/snap-8248577847462459384-1-55f5d7ba-1dad-42be-9a6a-fb30179fd803.avro
 differ
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/v1.metadata.json
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/v1.metadata.json
new file mode 100644
index 0000000000..680712659e
--- /dev/null
+++ 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/v1.metadata.json
@@ -0,0 +1,53 @@
+{
+  "format-version" : 2,
+  "table-uuid" : "5b15ea92-d590-427a-8b55-11e3c13d79a7",
+  "location" : 
"file:///tmp/junit6640909127060857423/default/db/test_upsert_query",
+  "last-sequence-number" : 0,
+  "last-updated-ms" : 1736318557891,
+  "last-column-id" : 3,
+  "current-schema-id" : 0,
+  "schemas" : [ {
+    "type" : "struct",
+    "schema-id" : 0,
+    "identifier-field-ids" : [ 1 ],
+    "fields" : [ {
+      "id" : 1,
+      "name" : "id",
+      "required" : true,
+      "type" : "int"
+    }, {
+      "id" : 2,
+      "name" : "name",
+      "required" : true,
+      "type" : "string"
+    }, {
+      "id" : 3,
+      "name" : "dt",
+      "required" : false,
+      "type" : "date"
+    } ]
+  } ],
+  "default-spec-id" : 0,
+  "partition-specs" : [ {
+    "spec-id" : 0,
+    "fields" : [ ]
+  } ],
+  "last-partition-id" : 999,
+  "default-sort-order-id" : 0,
+  "sort-orders" : [ {
+    "order-id" : 0,
+    "fields" : [ ]
+  } ],
+  "properties" : {
+    "write.format.default" : "PARQUET",
+    "write.parquet.compression-codec" : "zstd",
+    "write.upsert.enabled" : "true"
+  },
+  "current-snapshot-id" : -1,
+  "refs" : { },
+  "snapshots" : [ ],
+  "statistics" : [ ],
+  "partition-statistics" : [ ],
+  "snapshot-log" : [ ],
+  "metadata-log" : [ ]
+}
\ No newline at end of file
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/v2.metadata.json
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/v2.metadata.json
new file mode 100644
index 0000000000..52ff0e8257
--- /dev/null
+++ 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/v2.metadata.json
@@ -0,0 +1,89 @@
+{
+  "format-version" : 2,
+  "table-uuid" : "5b15ea92-d590-427a-8b55-11e3c13d79a7",
+  "location" : 
"file:///tmp/junit6640909127060857423/default/db/test_upsert_query",
+  "last-sequence-number" : 1,
+  "last-updated-ms" : 1736318559827,
+  "last-column-id" : 3,
+  "current-schema-id" : 0,
+  "schemas" : [ {
+    "type" : "struct",
+    "schema-id" : 0,
+    "identifier-field-ids" : [ 1 ],
+    "fields" : [ {
+      "id" : 1,
+      "name" : "id",
+      "required" : true,
+      "type" : "int"
+    }, {
+      "id" : 2,
+      "name" : "name",
+      "required" : true,
+      "type" : "string"
+    }, {
+      "id" : 3,
+      "name" : "dt",
+      "required" : false,
+      "type" : "date"
+    } ]
+  } ],
+  "default-spec-id" : 0,
+  "partition-specs" : [ {
+    "spec-id" : 0,
+    "fields" : [ ]
+  } ],
+  "last-partition-id" : 999,
+  "default-sort-order-id" : 0,
+  "sort-orders" : [ {
+    "order-id" : 0,
+    "fields" : [ ]
+  } ],
+  "properties" : {
+    "write.format.default" : "PARQUET",
+    "write.parquet.compression-codec" : "zstd",
+    "write.upsert.enabled" : "true"
+  },
+  "current-snapshot-id" : 8248577847462459384,
+  "refs" : {
+    "main" : {
+      "snapshot-id" : 8248577847462459384,
+      "type" : "branch"
+    }
+  },
+  "snapshots" : [ {
+    "sequence-number" : 1,
+    "snapshot-id" : 8248577847462459384,
+    "timestamp-ms" : 1736318559827,
+    "summary" : {
+      "operation" : "overwrite",
+      "flink.operator-id" : "e883208d19e3c34f8aaf2a3168a63337",
+      "flink.job-id" : "59611ef0235ae2abaa4fa46f390acc4a",
+      "flink.max-committed-checkpoint-id" : "9223372036854775807",
+      "added-data-files" : "1",
+      "added-equality-delete-files" : "1",
+      "added-delete-files" : "1",
+      "added-records" : "4",
+      "added-files-size" : "1352",
+      "added-equality-deletes" : "4",
+      "changed-partition-count" : "1",
+      "total-records" : "4",
+      "total-files-size" : "1352",
+      "total-data-files" : "1",
+      "total-delete-files" : "1",
+      "total-position-deletes" : "0",
+      "total-equality-deletes" : "4"
+    },
+    "manifest-list" : 
"file:/tmp/junit6640909127060857423/default/db/test_upsert_query/metadata/snap-8248577847462459384-1-55f5d7ba-1dad-42be-9a6a-fb30179fd803.avro",
+    "schema-id" : 0
+  } ],
+  "statistics" : [ ],
+  "partition-statistics" : [ ],
+  "snapshot-log" : [ {
+    "timestamp-ms" : 1736318559827,
+    "snapshot-id" : 8248577847462459384
+  } ],
+  "metadata-log" : [ {
+    "timestamp-ms" : 1736318557891,
+    "metadata-file" : 
"file:/tmp/junit6640909127060857423/default/db/test_upsert_query/metadata/v1.metadata.json"
+  } ]
+}
\ No newline at end of file
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/v3.metadata.json
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/v3.metadata.json
new file mode 100644
index 0000000000..747864c43e
--- /dev/null
+++ 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/v3.metadata.json
@@ -0,0 +1,121 @@
+{
+  "format-version" : 2,
+  "table-uuid" : "5b15ea92-d590-427a-8b55-11e3c13d79a7",
+  "location" : 
"file:///tmp/junit6640909127060857423/default/db/test_upsert_query",
+  "last-sequence-number" : 2,
+  "last-updated-ms" : 1736318560089,
+  "last-column-id" : 3,
+  "current-schema-id" : 0,
+  "schemas" : [ {
+    "type" : "struct",
+    "schema-id" : 0,
+    "identifier-field-ids" : [ 1 ],
+    "fields" : [ {
+      "id" : 1,
+      "name" : "id",
+      "required" : true,
+      "type" : "int"
+    }, {
+      "id" : 2,
+      "name" : "name",
+      "required" : true,
+      "type" : "string"
+    }, {
+      "id" : 3,
+      "name" : "dt",
+      "required" : false,
+      "type" : "date"
+    } ]
+  } ],
+  "default-spec-id" : 0,
+  "partition-specs" : [ {
+    "spec-id" : 0,
+    "fields" : [ ]
+  } ],
+  "last-partition-id" : 999,
+  "default-sort-order-id" : 0,
+  "sort-orders" : [ {
+    "order-id" : 0,
+    "fields" : [ ]
+  } ],
+  "properties" : {
+    "write.format.default" : "PARQUET",
+    "write.parquet.compression-codec" : "zstd",
+    "write.upsert.enabled" : "true"
+  },
+  "current-snapshot-id" : 6031039455377193257,
+  "refs" : {
+    "main" : {
+      "snapshot-id" : 6031039455377193257,
+      "type" : "branch"
+    }
+  },
+  "snapshots" : [ {
+    "sequence-number" : 1,
+    "snapshot-id" : 8248577847462459384,
+    "timestamp-ms" : 1736318559827,
+    "summary" : {
+      "operation" : "overwrite",
+      "flink.operator-id" : "e883208d19e3c34f8aaf2a3168a63337",
+      "flink.job-id" : "59611ef0235ae2abaa4fa46f390acc4a",
+      "flink.max-committed-checkpoint-id" : "9223372036854775807",
+      "added-data-files" : "1",
+      "added-equality-delete-files" : "1",
+      "added-delete-files" : "1",
+      "added-records" : "4",
+      "added-files-size" : "1352",
+      "added-equality-deletes" : "4",
+      "changed-partition-count" : "1",
+      "total-records" : "4",
+      "total-files-size" : "1352",
+      "total-data-files" : "1",
+      "total-delete-files" : "1",
+      "total-position-deletes" : "0",
+      "total-equality-deletes" : "4"
+    },
+    "manifest-list" : 
"file:/tmp/junit6640909127060857423/default/db/test_upsert_query/metadata/snap-8248577847462459384-1-55f5d7ba-1dad-42be-9a6a-fb30179fd803.avro",
+    "schema-id" : 0
+  }, {
+    "sequence-number" : 2,
+    "snapshot-id" : 6031039455377193257,
+    "parent-snapshot-id" : 8248577847462459384,
+    "timestamp-ms" : 1736318560089,
+    "summary" : {
+      "operation" : "overwrite",
+      "flink.operator-id" : "e883208d19e3c34f8aaf2a3168a63337",
+      "flink.job-id" : "74b0ee1b89537031ad64ceb5bb73fa11",
+      "flink.max-committed-checkpoint-id" : "9223372036854775807",
+      "added-data-files" : "1",
+      "added-equality-delete-files" : "1",
+      "added-delete-files" : "1",
+      "added-records" : "2",
+      "added-files-size" : "1357",
+      "added-equality-deletes" : "2",
+      "changed-partition-count" : "1",
+      "total-records" : "6",
+      "total-files-size" : "2709",
+      "total-data-files" : "2",
+      "total-delete-files" : "2",
+      "total-position-deletes" : "0",
+      "total-equality-deletes" : "6"
+    },
+    "manifest-list" : 
"file:/tmp/junit6640909127060857423/default/db/test_upsert_query/metadata/snap-6031039455377193257-1-7667f02f-4d6c-4a67-bf20-4aec7179400a.avro",
+    "schema-id" : 0
+  } ],
+  "statistics" : [ ],
+  "partition-statistics" : [ ],
+  "snapshot-log" : [ {
+    "timestamp-ms" : 1736318559827,
+    "snapshot-id" : 8248577847462459384
+  }, {
+    "timestamp-ms" : 1736318560089,
+    "snapshot-id" : 6031039455377193257
+  } ],
+  "metadata-log" : [ {
+    "timestamp-ms" : 1736318557891,
+    "metadata-file" : 
"file:/tmp/junit6640909127060857423/default/db/test_upsert_query/metadata/v1.metadata.json"
+  }, {
+    "timestamp-ms" : 1736318559827,
+    "metadata-file" : 
"file:/tmp/junit6640909127060857423/default/db/test_upsert_query/metadata/v2.metadata.json"
+  } ]
+}
\ No newline at end of file
diff --git 
a/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/version-hint.text
 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/version-hint.text
new file mode 100644
index 0000000000..e440e5c842
--- /dev/null
+++ 
b/gluten-iceberg/src-iceberg/test/resources/junit6640909127060857423/default/db/test_upsert_query/metadata/version-hint.text
@@ -0,0 +1 @@
+3
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to