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

blue pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg.git


The following commit(s) were added to refs/heads/main by this push:
     new afe4aec4db Spark: Don't allow branch_ usage with VERSION AS OF (#9219)
afe4aec4db is described below

commit afe4aec4db795f4829757d738a5bbcf1b7db8fd2
Author: Eduard Tudenhoefner <[email protected]>
AuthorDate: Tue Dec 5 17:14:09 2023 +0100

    Spark: Don't allow branch_ usage with VERSION AS OF (#9219)
---
 .../main/java/org/apache/iceberg/spark/SparkCatalog.java  |  2 +-
 .../java/org/apache/iceberg/spark/source/SparkTable.java  |  4 ++++
 .../java/org/apache/iceberg/spark/sql/TestSelect.java     | 15 +++++++++++++++
 .../main/java/org/apache/iceberg/spark/SparkCatalog.java  |  2 +-
 .../java/org/apache/iceberg/spark/source/SparkTable.java  |  4 ++++
 .../java/org/apache/iceberg/spark/sql/TestSelect.java     | 15 +++++++++++++++
 .../main/java/org/apache/iceberg/spark/SparkCatalog.java  |  2 +-
 .../java/org/apache/iceberg/spark/source/SparkTable.java  |  4 ++++
 .../java/org/apache/iceberg/spark/sql/TestSelect.java     | 15 +++++++++++++++
 9 files changed, 60 insertions(+), 3 deletions(-)

diff --git 
a/spark/v3.3/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java 
b/spark/v3.3/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java
index 02bbec6824..48decf995f 100644
--- a/spark/v3.3/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java
+++ b/spark/v3.3/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java
@@ -171,7 +171,7 @@ public class SparkCatalog extends BaseCatalog {
       SparkTable sparkTable = (SparkTable) table;
 
       Preconditions.checkArgument(
-          sparkTable.snapshotId() == null,
+          sparkTable.snapshotId() == null && sparkTable.branch() == null,
           "Cannot do time-travel based on both table identifier and AS OF");
 
       try {
diff --git 
a/spark/v3.3/spark/src/main/java/org/apache/iceberg/spark/source/SparkTable.java
 
b/spark/v3.3/spark/src/main/java/org/apache/iceberg/spark/source/SparkTable.java
index 574d014e83..eddcdb1819 100644
--- 
a/spark/v3.3/spark/src/main/java/org/apache/iceberg/spark/source/SparkTable.java
+++ 
b/spark/v3.3/spark/src/main/java/org/apache/iceberg/spark/source/SparkTable.java
@@ -173,6 +173,10 @@ public class SparkTable
     return snapshotId;
   }
 
+  public String branch() {
+    return branch;
+  }
+
   public SparkTable copyWithSnapshotId(long newSnapshotId) {
     return new SparkTable(icebergTable, newSnapshotId, refreshEagerly);
   }
diff --git 
a/spark/v3.3/spark/src/test/java/org/apache/iceberg/spark/sql/TestSelect.java 
b/spark/v3.3/spark/src/test/java/org/apache/iceberg/spark/sql/TestSelect.java
index e08bc4574d..1368c26792 100644
--- 
a/spark/v3.3/spark/src/test/java/org/apache/iceberg/spark/sql/TestSelect.java
+++ 
b/spark/v3.3/spark/src/test/java/org/apache/iceberg/spark/sql/TestSelect.java
@@ -426,6 +426,21 @@ public class TestSelect extends SparkCatalogTestBase {
         });
   }
 
+  @Test
+  public void testInvalidTimeTravelAgainstBranchIdentifierWithAsOf() {
+    long snapshotId = 
validationCatalog.loadTable(tableIdent).currentSnapshot().snapshotId();
+    
validationCatalog.loadTable(tableIdent).manageSnapshots().createBranch("b1").commit();
+
+    // create a second snapshot
+    sql("INSERT INTO %s VALUES (4, 'd', 4.0), (5, 'e', 5.0)", tableName);
+
+    // using branch_b1 in the table identifier and VERSION AS OF
+    Assertions.assertThatThrownBy(
+            () -> sql("SELECT * FROM %s.branch_b1 VERSION AS OF %s", 
tableName, snapshotId))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Cannot do time-travel based on both table identifier and 
AS OF");
+  }
+
   @Test
   public void testSpecifySnapshotAndTimestamp() {
     // get the snapshot ID of the last write
diff --git 
a/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java 
b/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java
index 6958ebc103..6b7becc77c 100644
--- a/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java
+++ b/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java
@@ -170,7 +170,7 @@ public class SparkCatalog extends BaseCatalog {
       SparkTable sparkTable = (SparkTable) table;
 
       Preconditions.checkArgument(
-          sparkTable.snapshotId() == null,
+          sparkTable.snapshotId() == null && sparkTable.branch() == null,
           "Cannot do time-travel based on both table identifier and AS OF");
 
       try {
diff --git 
a/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/source/SparkTable.java
 
b/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/source/SparkTable.java
index e200bee03e..bbc7434138 100644
--- 
a/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/source/SparkTable.java
+++ 
b/spark/v3.4/spark/src/main/java/org/apache/iceberg/spark/source/SparkTable.java
@@ -173,6 +173,10 @@ public class SparkTable
     return snapshotId;
   }
 
+  public String branch() {
+    return branch;
+  }
+
   public SparkTable copyWithSnapshotId(long newSnapshotId) {
     return new SparkTable(icebergTable, newSnapshotId, refreshEagerly);
   }
diff --git 
a/spark/v3.4/spark/src/test/java/org/apache/iceberg/spark/sql/TestSelect.java 
b/spark/v3.4/spark/src/test/java/org/apache/iceberg/spark/sql/TestSelect.java
index dacaee7d80..161c2e0ba6 100644
--- 
a/spark/v3.4/spark/src/test/java/org/apache/iceberg/spark/sql/TestSelect.java
+++ 
b/spark/v3.4/spark/src/test/java/org/apache/iceberg/spark/sql/TestSelect.java
@@ -421,6 +421,21 @@ public class TestSelect extends SparkCatalogTestBase {
         .hasMessage("Cannot do time-travel based on both table identifier and 
AS OF");
   }
 
+  @Test
+  public void testInvalidTimeTravelAgainstBranchIdentifierWithAsOf() {
+    long snapshotId = 
validationCatalog.loadTable(tableIdent).currentSnapshot().snapshotId();
+    
validationCatalog.loadTable(tableIdent).manageSnapshots().createBranch("b1").commit();
+
+    // create a second snapshot
+    sql("INSERT INTO %s VALUES (4, 'd', 4.0), (5, 'e', 5.0)", tableName);
+
+    // using branch_b1 in the table identifier and VERSION AS OF
+    Assertions.assertThatThrownBy(
+            () -> sql("SELECT * FROM %s.branch_b1 VERSION AS OF %s", 
tableName, snapshotId))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Cannot do time-travel based on both table identifier and 
AS OF");
+  }
+
   @Test
   public void testSpecifySnapshotAndTimestamp() {
     // get the snapshot ID of the last write
diff --git 
a/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java 
b/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java
index 467b428994..eef0f0703b 100644
--- a/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java
+++ b/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java
@@ -170,7 +170,7 @@ public class SparkCatalog extends BaseCatalog {
       SparkTable sparkTable = (SparkTable) table;
 
       Preconditions.checkArgument(
-          sparkTable.snapshotId() == null,
+          sparkTable.snapshotId() == null && sparkTable.branch() == null,
           "Cannot do time-travel based on both table identifier and AS OF");
 
       try {
diff --git 
a/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/source/SparkTable.java
 
b/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/source/SparkTable.java
index e200bee03e..bbc7434138 100644
--- 
a/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/source/SparkTable.java
+++ 
b/spark/v3.5/spark/src/main/java/org/apache/iceberg/spark/source/SparkTable.java
@@ -173,6 +173,10 @@ public class SparkTable
     return snapshotId;
   }
 
+  public String branch() {
+    return branch;
+  }
+
   public SparkTable copyWithSnapshotId(long newSnapshotId) {
     return new SparkTable(icebergTable, newSnapshotId, refreshEagerly);
   }
diff --git 
a/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/sql/TestSelect.java 
b/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/sql/TestSelect.java
index dacaee7d80..161c2e0ba6 100644
--- 
a/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/sql/TestSelect.java
+++ 
b/spark/v3.5/spark/src/test/java/org/apache/iceberg/spark/sql/TestSelect.java
@@ -421,6 +421,21 @@ public class TestSelect extends SparkCatalogTestBase {
         .hasMessage("Cannot do time-travel based on both table identifier and 
AS OF");
   }
 
+  @Test
+  public void testInvalidTimeTravelAgainstBranchIdentifierWithAsOf() {
+    long snapshotId = 
validationCatalog.loadTable(tableIdent).currentSnapshot().snapshotId();
+    
validationCatalog.loadTable(tableIdent).manageSnapshots().createBranch("b1").commit();
+
+    // create a second snapshot
+    sql("INSERT INTO %s VALUES (4, 'd', 4.0), (5, 'e', 5.0)", tableName);
+
+    // using branch_b1 in the table identifier and VERSION AS OF
+    Assertions.assertThatThrownBy(
+            () -> sql("SELECT * FROM %s.branch_b1 VERSION AS OF %s", 
tableName, snapshotId))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Cannot do time-travel based on both table identifier and 
AS OF");
+  }
+
   @Test
   public void testSpecifySnapshotAndTimestamp() {
     // get the snapshot ID of the last write

Reply via email to