{"record":{"id":"70d7ddb297971113","repo":"apache/beam","slug":"duplicate-table-tablename-from-provider-provider","errorCode":null,"errorMessage":"Duplicate table: ${tableName} from provider: ${provider}","messagePattern":"Duplicate table: (.+?) from provider: (.+?)","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/store/InMemoryMetaStore.java","lineNumber":116,"sourceCode":"    }\n  }\n\n  @Override\n  public void registerProvider(TableProvider provider) {\n    String type = provider.getTableType().toLowerCase();\n    if (providers.containsKey(type)) {\n      throw new IllegalArgumentException(\"Provider is already registered for table type: \" + type);\n    }\n\n    initTablesFromProvider(provider);\n    this.providers.put(type, provider);\n  }\n\n  private void initTablesFromProvider(TableProvider provider) {\n    Map<String, Table> tables = provider.getTables();\n    for (String tableName : tables.keySet()) {\n      if (this.tables.containsKey(tableName)) {\n        throw new IllegalStateException(\n            \"Duplicate table: \" + tableName + \" from provider: \" + provider);\n      }\n    }\n    this.tables.putAll(tables);\n  }\n\n  @Override\n  public Map<String, TableProvider> tableProviders() {\n    return providers;\n  }\n\n  @Override\n  public boolean supportsPartitioning(Table table) {\n    return getProvider(table.getType()).supportsPartitioning(table);\n  }\n\n  /**\n   * Fetches a {@link TableProvider} for this type. This provider can exist in the current {@link","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/store/InMemoryMetaStore.java#L98-L134","documentation":"initTablesFromProvider imports all tables exposed by a newly registered provider into the metastore and throws IllegalStateException if any of those table names already exist in the metastore. This prevents a provider registration from silently shadowing existing tables.","triggerScenarios":"registerProvider(provider) where provider.getTables() returns a table whose name collides with a table already in the metastore (created earlier or imported from another provider).","commonSituations":"Registering a second provider that pre-defines common table names like 'orders'; registering the same composite provider chain twice after tables were already imported.","solutions":["Rename the colliding table in one of the providers.","Drop the existing table before registering the new provider.","Register all providers on a fresh metastore before creating any tables manually."],"exampleFix":"// before\nmetaStore.createTable(existingTable);\nmetaStore.registerProvider(providerWithSameTableName); // throws\n// after\nmetaStore.registerProvider(providerWithSameTableName); // import first\nmetaStore.createTable(existingTable); // then add extra tables with unique names","handlingStrategy":"validation","validationCode":"for (String name : provider.getTables().keySet()) {\n  if (metaStore.getTable(name) != null) {\n    throw new IllegalStateException(\"Collision on table: \" + name);\n  }\n}\nmetaStore.registerProvider(provider);","typeGuard":null,"tryCatchPattern":"try {\n  metaStore.registerProvider(provider);\n} catch (IllegalStateException e) {\n  if (e.getMessage().startsWith(\"Duplicate table:\")) { /* rename or drop first */ }\n}","preventionTips":["Namespace table names per provider to avoid collisions.","Register providers before manual createTable calls.","Audit provider.getTables() names in tests."],"tags":["beam-sql","metastore","name-collision"],"backgroundTag":"file-already-exists","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}