apache/beam · error · SqlUtil.newContextException

Unable to drop active catalog

Error message

Unable to drop active catalog '%s'. Please switch to another catalog first.

What it means

Raised by DROP CATALOG when attempting to drop the catalog that is currently in use (the session's active catalog). Beam refuses to avoid leaving the session without a current catalog, and throws a Calcite context exception instructing the user to switch first.

Solutions

  1. Switch to another catalog first: USE CATALOG <other-catalog>; then re-run the DROP
  2. Order teardown scripts so the active catalog is dropped last
  3. Check the current catalog before issuing DROP CATALOG

Example fix

// before
DROP CATALOG my_catalog;  -- my_catalog is active
// after
USE CATALOG default_catalog;
DROP CATALOG my_catalog;
Defensive patterns

Strategy: try-catch

Validate before calling

// switch away from the active catalog before dropping
stmt.execute("USE CATALOG default_catalog");
stmt.execute("DROP CATALOG " + name);

Try / catch

try {
    stmt.execute("DROP CATALOG " + name);
} catch (Exception e) {
    if (e.getMessage().contains("active catalog")) {
        stmt.execute("USE CATALOG default_catalog");
        stmt.execute("DROP CATALOG " + name);
    }
}

Prevention

When it happens

Trigger: Executing `DROP CATALOG name` while catalogManager.currentCatalog().name().equals(name), i.e. the session's active catalog equals the one being dropped.

Common situations: Cleanup scripts that drop all catalogs while still attached to one; interactive sessions forgetting a prior `USE CATALOG default` switch.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/fc76dde395cdfc23. Report an issue: GitHub.

Appendix: source

Thrown at sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/CatalogManagerSchema.java:131

    catalogManager.useCatalog(name);
    LOG.info("Switched to catalog '{}' (type: {})", name, catalogManager.currentCatalog().type());
  }

  public void dropCatalog(SqlIdentifier identifier, boolean ifExists) {
    String name = SqlDdlNodes.name(identifier);
    if (catalogManager.getCatalog(name) == null) {
      if (!ifExists) {
        throw SqlUtil.newContextException(
            identifier.getParserPosition(),
            RESOURCE.internal(String.format("Cannot drop catalog: '%s' not found.", name)));
      }
      LOG.info("Ignoring 'DROP CATALOG` call for non-existent catalog: {}", name);
      return;
    }

    if (catalogManager.currentCatalog().name().equals(name)) {
      throw SqlUtil.newContextException(
          identifier.getParserPosition(),
          RESOURCE.internal(
              String.format(
                  "Unable to drop active catalog '%s'. Please switch to another catalog first.",
                  name)));
    }

    catalogManager.dropCatalog(name);
    LOG.info("Successfully dropped catalog '{}'", name);
    catalogSubSchemas.remove(name);
  }

  // A BeamCalciteSchema may be used to interact with multiple TableProviders.
  // If such a TableProvider is not registered in the BeamCalciteSchema, this method
  // will attempt to do so.
  public void maybeRegisterProvider(TableName path, String type) {
    type = type.toLowerCase();
    CatalogSchema catalogSchema = getCatalogSchema(path);

View on GitHub (pinned to 12126d8942)