diff --git a/pyiceberg/catalog/glue.py b/pyiceberg/catalog/glue.py index 01bb0e9b05..c028d7f074 100644 --- a/pyiceberg/catalog/glue.py +++ b/pyiceberg/catalog/glue.py @@ -680,13 +680,19 @@ def drop_namespace(self, namespace: Union[str, Identifier]) -> None: """ database_name = self.identifier_to_database(namespace, NoSuchNamespaceError) try: - table_list = self.list_tables(namespace=database_name) - except NoSuchNamespaceError as e: + table_list_response = self.glue.get_tables(DatabaseName=database_name) + table_list = table_list_response["TableList"] + except self.glue.exceptions.EntityNotFoundException as e: raise NoSuchNamespaceError(f"Database does not exist: {database_name}") from e if len(table_list) > 0: - raise NamespaceNotEmptyError(f"Database {database_name} is not empty") - + first_table = table_list[0] + if self.__is_iceberg_table(first_table): + raise NamespaceNotEmptyError(f"Cannot drop namespace {database_name} because it still contains Iceberg tables") + else: + raise NamespaceNotEmptyError( + f"Cannot drop namespace {database_name} because it still contains non-Iceberg tables" + ) self.glue.delete_database(Name=database_name) def list_tables(self, namespace: Union[str, Identifier]) -> List[Identifier]: diff --git a/tests/catalog/test_glue.py b/tests/catalog/test_glue.py index df1734eb68..399c9e8bb1 100644 --- a/tests/catalog/test_glue.py +++ b/tests/catalog/test_glue.py @@ -548,6 +548,18 @@ def test_drop_non_empty_namespace( test_catalog.drop_namespace(database_name) +@mock_aws +def test_drop_namespace_that_contains_non_iceberg_tables( + _bucket_initialize: None, moto_endpoint_url: str, table_schema_nested: Schema, database_name: str, table_name: str +) -> None: + test_catalog = GlueCatalog("glue", **{"s3.endpoint": moto_endpoint_url, "warehouse": f"s3://{BUCKET_NAME}/"}) + test_catalog.create_namespace(namespace=database_name) + test_catalog.glue.create_table(DatabaseName=database_name, TableInput={"Name": "hive_table"}) + + with pytest.raises(NamespaceNotEmptyError): + test_catalog.drop_namespace(database_name) + + @mock_aws def test_drop_non_exist_namespace(_bucket_initialize: None, moto_endpoint_url: str, database_name: str) -> None: test_catalog = GlueCatalog("glue", **{"s3.endpoint": moto_endpoint_url})