{"record":{"id":"67e630e6da2437e5","repo":"apache/iceberg","slug":"loadnamespacemetadata-must-be-at-either-database-o","errorCode":null,"errorMessage":"loadNamespaceMetadata must be at either DATABASE or SCHEMA level; got %s from namespace %s","messagePattern":"loadNamespaceMetadata must be at either DATABASE or SCHEMA level; got (.+?) from namespace (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"snowflake/src/main/java/org/apache/iceberg/snowflake/SnowflakeCatalog.java","lineNumber":211,"sourceCode":"    }\n\n    return results.stream().map(NamespaceHelpers::toIcebergNamespace).collect(Collectors.toList());\n  }\n\n  @Override\n  public Map<String, String> loadNamespaceMetadata(Namespace namespace)\n      throws NoSuchNamespaceException {\n    SnowflakeIdentifier id = NamespaceHelpers.toSnowflakeIdentifier(namespace);\n    boolean namespaceExists;\n    switch (id.type()) {\n      case DATABASE:\n        namespaceExists = snowflakeClient.databaseExists(id);\n        break;\n      case SCHEMA:\n        namespaceExists = snowflakeClient.schemaExists(id);\n        break;\n      default:\n        throw new IllegalArgumentException(\n            String.format(\n                \"loadNamespaceMetadata must be at either DATABASE or SCHEMA level; got %s from namespace %s\",\n                id, namespace));\n    }\n    if (namespaceExists) {\n      return ImmutableMap.of();\n    } else {\n      throw new NoSuchNamespaceException(\n          \"Namespace '%s' with snowflake identifier '%s' doesn't exist\", namespace, id);\n    }\n  }\n\n  @Override\n  public boolean dropNamespace(Namespace namespace) {\n    throw new UnsupportedOperationException(\n        \"SnowflakeCatalog does not currently support dropNamespace\");\n  }\n","sourceCodeStart":193,"sourceCodeEnd":229,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/snowflake/src/main/java/org/apache/iceberg/snowflake/SnowflakeCatalog.java#L193-L229","documentation":"SnowflakeCatalog.loadNamespaceMetadata resolves the namespace to a Snowflake identifier and only supports DATABASE or SCHEMA level. ROOT-level (empty) namespaces and other scopes hit the default branch and throw IllegalArgumentException, since there is no database/schema object to check for existence.","triggerScenarios":"Calling loadNamespaceMetrics on an empty namespace (Namespace.empty()) or a namespace with more than two levels; the namespace must be 1 or 2 levels.","commonSituations":"Generic code loading metadata for Namespace.empty() assuming a root entry exists; engines probing root-level namespace metadata; mixed-level loops over namespaces.","solutions":["Call loadNamespaceMetadata only with one-level (database) or two-level (database.schema) namespaces","Skip ROOT-level namespaces in generic metadata loaders","Validate namespace.levels().length is 1 or 2 before calling"],"exampleFix":"// before\ncatalog.loadNamespaceMetadata(Namespace.empty()); // throws\n// after\nif (namespace.levels().length >= 1 && namespace.levels().length <= 2) {\n  catalog.loadNamespaceMetadata(namespace);\n}","handlingStrategy":"validation","validationCode":"int depth = namespace.levels().length;\nif (depth < 1 || depth > 2) {\n  throw new IllegalArgumentException(\n      \"loadNamespaceMetadata requires DATABASE or SCHEMA level: \" + namespace);\n}","typeGuard":"boolean isLoadableNamespace(Namespace ns) {\n  int d = ns == null ? 0 : ns.levels().length;\n  return d == 1 || d == 2;\n}","tryCatchPattern":"try {\n  catalog.loadNamespaceMetadata(namespace);\n} catch (IllegalArgumentException e) {\n  // skip ROOT-level or over-deep namespaces\n}","preventionTips":["Never probe metadata for Namespace.empty() on SnowflakeCatalog","Validate namespace arity before metadata loads","Handle root specially in generic metadata tooling","Keep namespace depth checks in one shared utility"],"tags":["snowflake","namespace","validation","metadata"],"backgroundTag":"invalid-argument-value","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}