From 9225261b6f9fe660a9a84d6dd8cf6fc0acf06927 Mon Sep 17 00:00:00 2001 From: Jack Ye Date: Thu, 5 Feb 2026 16:33:13 -0800 Subject: [PATCH 1/2] fix: use deregisterTable for dropTable and dropTable for purgeTable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - dropTable now calls namespace.deregisterTable() which only removes metadata without deleting the underlying data - purgeTable now calls namespace.dropTable() which removes metadata and deletes the underlying data - Updated DirectoryNamespace tests to disable extra_level config and explicitly create the "default" namespace so that manifest mode is used instead of directory listing mode 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../spark/BaseLanceNamespaceSparkCatalog.java | 18 ++++++++++++++++++ .../spark/BaseTestSparkDirectoryNamespace.java | 15 +++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/lance-spark-base_2.12/src/main/java/org/lance/spark/BaseLanceNamespaceSparkCatalog.java b/lance-spark-base_2.12/src/main/java/org/lance/spark/BaseLanceNamespaceSparkCatalog.java index 789589517..d23c5dace 100644 --- a/lance-spark-base_2.12/src/main/java/org/lance/spark/BaseLanceNamespaceSparkCatalog.java +++ b/lance-spark-base_2.12/src/main/java/org/lance/spark/BaseLanceNamespaceSparkCatalog.java @@ -17,6 +17,7 @@ import org.lance.WriteParams; import org.lance.namespace.LanceNamespace; import org.lance.namespace.errors.TableNotFoundException; +import org.lance.namespace.model.DeregisterTableRequest; import org.lance.namespace.model.DescribeTableRequest; import org.lance.namespace.model.DescribeTableResponse; import org.lance.namespace.model.DropNamespaceRequest; @@ -479,6 +480,23 @@ public Table alterTable(Identifier ident, TableChange... changes) throws NoSuchT @Override public boolean dropTable(Identifier ident) { + try { + Identifier tableId = transformIdentifierForApi(ident); + DeregisterTableRequest deregisterRequest = new DeregisterTableRequest(); + for (String part : tableId.namespace()) { + deregisterRequest.addIdItem(part); + } + deregisterRequest.addIdItem(tableId.name()); + namespace.deregisterTable(deregisterRequest); + + return true; + } catch (Exception e) { + return false; + } + } + + @Override + public boolean purgeTable(Identifier ident) { try { Identifier tableId = transformIdentifierForApi(ident); DropTableRequest dropRequest = new DropTableRequest(); diff --git a/lance-spark-base_2.12/src/test/java/org/lance/spark/BaseTestSparkDirectoryNamespace.java b/lance-spark-base_2.12/src/test/java/org/lance/spark/BaseTestSparkDirectoryNamespace.java index 4aa194642..8a9856a1a 100644 --- a/lance-spark-base_2.12/src/test/java/org/lance/spark/BaseTestSparkDirectoryNamespace.java +++ b/lance-spark-base_2.12/src/test/java/org/lance/spark/BaseTestSparkDirectoryNamespace.java @@ -13,9 +13,12 @@ */ package org.lance.spark; +import java.io.IOException; import java.util.HashMap; import java.util.Map; +import org.junit.jupiter.api.BeforeEach; + /** Test for BaseLanceNamespaceSparkCatalog using DirectoryNamespace implementation. */ public abstract class BaseTestSparkDirectoryNamespace extends SparkLanceNamespaceTestBase { @@ -28,6 +31,18 @@ protected String getNsImpl() { protected Map getAdditionalNsConfigs() { Map configs = new HashMap<>(); configs.put("root", tempDir.toString()); + // Disable extra_level so "default" is treated as an actual child namespace + // This ensures manifest mode is used instead of directory listing mode + configs.put("extra_level", ""); return configs; } + + @BeforeEach + @Override + void setup() throws IOException { + super.setup(); + // Create the "default" namespace explicitly so that DirectoryNamespace uses manifest mode + // instead of directory listing mode. This is required for deregisterTable to work correctly. + spark.sql("CREATE NAMESPACE " + catalogName + ".default"); + } } From b17880fc4f57249b5e315292e8ec438069fe8a5a Mon Sep 17 00:00:00 2001 From: Jack Ye Date: Thu, 5 Feb 2026 16:59:04 -0800 Subject: [PATCH 2/2] fmt --- .../java/org/lance/spark/BaseTestSparkDirectoryNamespace.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lance-spark-base_2.12/src/test/java/org/lance/spark/BaseTestSparkDirectoryNamespace.java b/lance-spark-base_2.12/src/test/java/org/lance/spark/BaseTestSparkDirectoryNamespace.java index 8a9856a1a..a433a8bb1 100644 --- a/lance-spark-base_2.12/src/test/java/org/lance/spark/BaseTestSparkDirectoryNamespace.java +++ b/lance-spark-base_2.12/src/test/java/org/lance/spark/BaseTestSparkDirectoryNamespace.java @@ -13,12 +13,12 @@ */ package org.lance.spark; +import org.junit.jupiter.api.BeforeEach; + import java.io.IOException; import java.util.HashMap; import java.util.Map; -import org.junit.jupiter.api.BeforeEach; - /** Test for BaseLanceNamespaceSparkCatalog using DirectoryNamespace implementation. */ public abstract class BaseTestSparkDirectoryNamespace extends SparkLanceNamespaceTestBase {