diff --git a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/read/BaseScan.scala b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/read/BaseScan.scala index 42f724d3e692..3237475d69e0 100644 --- a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/read/BaseScan.scala +++ b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/read/BaseScan.scala @@ -68,7 +68,10 @@ trait BaseScan extends Scan with SupportsReportStatistics with Logging { val coreOptions: CoreOptions = CoreOptions.fromMap(table.options()) lazy val tableRowType: RowType = { - if (coreOptions.rowTrackingEnabled()) { + if ( + coreOptions + .rowTrackingEnabled() && !table.rowType().containsField(SpecialFields.ROW_ID.name()) + ) { SpecialFields.rowTypeWithRowTracking(table.rowType()) } else { table.rowType() diff --git a/paimon-spark/paimon-spark-ut/src/test/scala/org/apache/paimon/spark/sql/RowTrackingTestBase.scala b/paimon-spark/paimon-spark-ut/src/test/scala/org/apache/paimon/spark/sql/RowTrackingTestBase.scala index 0ea9d21bcf2a..122caedc04a7 100644 --- a/paimon-spark/paimon-spark-ut/src/test/scala/org/apache/paimon/spark/sql/RowTrackingTestBase.scala +++ b/paimon-spark/paimon-spark-ut/src/test/scala/org/apache/paimon/spark/sql/RowTrackingTestBase.scala @@ -952,4 +952,16 @@ abstract class RowTrackingTestBase extends PaimonSparkTestBase { assert(!indexEntries.exists(entry => entry.partition().getString(0).toString.equals("p1"))) } } + + test("query row_tracking system table should not throw duplicate _ROW_ID error") { + withTable("T") { + sql( + "CREATE TABLE T (a INT, b STRING) TBLPROPERTIES ('row-tracking.enabled' = 'true')") + sql("INSERT INTO T VALUES (1, 'a'), (2, 'b')") + checkAnswer( + sql("SELECT a, b FROM `T$row_tracking` ORDER BY a"), + Seq(Row(1, "a"), Row(2, "b")) + ) + } + } }