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..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,6 +13,9 @@ */ package org.lance.spark; +import org.junit.jupiter.api.BeforeEach; + +import java.io.IOException; import java.util.HashMap; import java.util.Map; @@ -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"); + } }