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

etudenhoefner 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 d28fcf2f74 Spark: Don't allow branch_ usage with TIMESTAMP AS OF 
(#10059)
d28fcf2f74 is described below

commit d28fcf2f746945d93d42d63268564d08c7b13a72
Author: Eduard Tudenhoefner <[email protected]>
AuthorDate: Sun Mar 31 12:55:18 2024 +0200

    Spark: Don't allow branch_ usage with TIMESTAMP AS OF (#10059)
---
 .../spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java  | 2 +-
 .../src/test/java/org/apache/iceberg/spark/sql/TestSelect.java      | 6 ++++++
 .../spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java  | 2 +-
 .../src/test/java/org/apache/iceberg/spark/sql/TestSelect.java      | 6 ++++++
 .../spark/src/main/java/org/apache/iceberg/spark/SparkCatalog.java  | 2 +-
 .../src/test/java/org/apache/iceberg/spark/sql/TestSelect.java      | 5 +++++
 6 files changed, 20 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 48decf995f..5638af071a 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
@@ -205,7 +205,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");
 
       // convert the timestamp to milliseconds as Spark passes microseconds
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 54d8dd01b9..2265dec476 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
@@ -453,6 +453,12 @@ public class TestSelect extends SparkCatalogTestBase {
             () -> 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");
+
+    // using branch_b1 in the table identifier and TIMESTAMP AS OF
+    Assertions.assertThatThrownBy(
+            () -> sql("SELECT * FROM %s.branch_b1 TIMESTAMP AS OF now()", 
tableName))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Cannot do time-travel based on both table identifier and 
AS OF");
   }
 
   @Test
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 d72a281fe8..7894adee41 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
@@ -215,7 +215,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");
 
       // convert the timestamp to milliseconds as Spark passes microseconds
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 93bb21b41a..85d340c8b2 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
@@ -448,6 +448,12 @@ public class TestSelect extends SparkCatalogTestBase {
             () -> 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");
+
+    // using branch_b1 in the table identifier and TIMESTAMP AS OF
+    Assertions.assertThatThrownBy(
+            () -> sql("SELECT * FROM %s.branch_b1 TIMESTAMP AS OF now()", 
tableName))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Cannot do time-travel based on both table identifier and 
AS OF");
   }
 
   @Test
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 7357a4683b..0be9fd9484 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
@@ -215,7 +215,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");
 
       // convert the timestamp to milliseconds as Spark passes microseconds
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 4c99a38d29..3ecfc60b49 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
@@ -529,6 +529,11 @@ public class TestSelect extends CatalogTestBase {
             () -> 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");
+
+    // using branch_b1 in the table identifier and TIMESTAMP AS OF
+    assertThatThrownBy(() -> sql("SELECT * FROM %s.branch_b1 TIMESTAMP AS OF 
now()", tableName))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessage("Cannot do time-travel based on both table identifier and 
AS OF");
   }
 
   @TestTemplate

Reply via email to