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