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

JingsongLi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git


The following commit(s) were added to refs/heads/master by this push:
     new a3121b7a1c [spark] Test count with DV merge-on-read level-0 files 
(#8894)
a3121b7a1c is described below

commit a3121b7a1cb7b1e9c86da3cb21bd857e282841a9
Author: Zouxxyy <[email protected]>
AuthorDate: Wed Jul 29 08:11:03 2026 +0800

    [spark] Test count with DV merge-on-read level-0 files (#8894)
---
 .../paimon/spark/sql/PushDownAggregatesTest.scala  | 33 ++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git 
a/paimon-spark/paimon-spark-ut/src/test/scala/org/apache/paimon/spark/sql/PushDownAggregatesTest.scala
 
b/paimon-spark/paimon-spark-ut/src/test/scala/org/apache/paimon/spark/sql/PushDownAggregatesTest.scala
index feb20e8da2..3c195d150f 100644
--- 
a/paimon-spark/paimon-spark-ut/src/test/scala/org/apache/paimon/spark/sql/PushDownAggregatesTest.scala
+++ 
b/paimon-spark/paimon-spark-ut/src/test/scala/org/apache/paimon/spark/sql/PushDownAggregatesTest.scala
@@ -239,6 +239,39 @@ class PushDownAggregatesTest extends PaimonSparkTestBase 
with AdaptiveSparkPlanH
       })
   }
 
+  test("Count with deletion-vector merge-on-read and level-0 files") {
+    withTable("T") {
+      sql("""
+            |CREATE TABLE T (id INT, value STRING)
+            |TBLPROPERTIES (
+            | 'primary-key' = 'id',
+            | 'bucket' = '1',
+            | 'deletion-vectors.enabled' = 'true',
+            | 'deletion-vectors.merge-on-read' = 'true',
+            | 'write-only' = 'true'
+            |)
+            |""".stripMargin)
+
+      sql("INSERT INTO T VALUES (1, 'a'), (2, 'b'), (3, 'c')")
+      checkAnswer(sql("SELECT COUNT(*), MIN(level), MAX(level) FROM 
`T$files`"), Row(1, 0, 0))
+      // A single non-overlapping L0 file has an exact row count.
+      runAndCheckAggregate("SELECT COUNT(*) FROM T", Row(3) :: Nil, 0)
+
+      sql("DELETE FROM T WHERE id = 2")
+      checkAnswer(sql("SELECT COUNT(*), MIN(level), MAX(level) FROM 
`T$files`"), Row(2, 0, 0))
+      // The L0 delete record overlaps with the original file and requires MOR.
+      runAndCheckAggregate("SELECT COUNT(*) FROM T", Row(2) :: Nil, 2)
+
+      sql("INSERT INTO T VALUES (1, 'updated'), (4, 'd')")
+      checkAnswer(sql("SELECT COUNT(*), MIN(level), MAX(level) FROM 
`T$files`"), Row(3, 0, 0))
+      checkAnswer(
+        sql("SELECT * FROM T ORDER BY id"),
+        Row(1, "updated") :: Row(3, "c") :: Row(4, "d") :: Nil)
+      // Overlapping L0 files require MOR again, so Spark executes the 
aggregate.
+      runAndCheckAggregate("SELECT COUNT(*) FROM T", Row(3) :: Nil, 2)
+    }
+  }
+
   test("Push down aggregate - table with deletion vector") {
     Seq(true, false).foreach(
       deletionVectorsEnabled => {

Reply via email to