{"record":{"id":"a87a3c85a052fbb2","repo":"apache/seatunnel","slug":"catalog-table-size-is-error","errorCode":"CATALOG_TABLE_SIZE_IS_ERROR","errorMessage":"The catalogTableFromConfigs size is not correct","messagePattern":"The catalogTableFromConfigs size is not correct","errorType":"error_code","errorClass":"SeaTunnelRuntimeException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/config/BaseMultipleTableFileSourceConfig.java","lineNumber":56,"sourceCode":"    private static final long serialVersionUID = 1L;\n\n    @Getter private List<BaseFileSourceConfig> fileSourceConfigs;\n\n    public BaseMultipleTableFileSourceConfig(\n            ReadonlyConfig fileSourceRootConfig, List<CatalogTable> catalogTablesFromConfig) {\n        if (fileSourceRootConfig.getOptional(ConnectorCommonOptions.TABLE_CONFIGS).isPresent()) {\n            parseFromFileSourceConfigs(fileSourceRootConfig, catalogTablesFromConfig);\n        } else {\n            parseFromFileSourceConfig(fileSourceRootConfig, catalogTablesFromConfig.get(0));\n        }\n    }\n\n    private void parseFromFileSourceConfigs(\n            ReadonlyConfig fileSourceRootConfig, List<CatalogTable> catalogTableFromConfigs) {\n        final List<Map<String, Object>> maps =\n                fileSourceRootConfig.get(ConnectorCommonOptions.TABLE_CONFIGS);\n        if (catalogTableFromConfigs.size() != maps.size()) {\n            throw new SeaTunnelRuntimeException(\n                    CATALOG_TABLE_SIZE_IS_ERROR, \"The catalogTableFromConfigs size is not correct\");\n        }\n        this.fileSourceConfigs = new ArrayList<>();\n        for (int i = 0; i < catalogTableFromConfigs.size(); i++) {\n            fileSourceConfigs.add(\n                    this.getBaseSourceConfig(\n                            ReadonlyConfig.fromMap(maps.get(i)), catalogTableFromConfigs.get(i)));\n        }\n    }\n\n    public abstract BaseFileSourceConfig getBaseSourceConfig(\n            ReadonlyConfig readonlyConfig, CatalogTable catalogTableFromConfig);\n\n    private void parseFromFileSourceConfig(\n            ReadonlyConfig fileSourceRootConfig, CatalogTable catalogTableFromConfig) {\n        this.fileSourceConfigs =\n                Lists.newArrayList(\n                        getBaseSourceConfig(fileSourceRootConfig, catalogTableFromConfig));","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/config/BaseMultipleTableFileSourceConfig.java#L38-L74","documentation":"BaseMultipleTableFileSourceConfig.parseFromFileSourceConfigs builds per-table file source configs from table_configs and the pre-parsed catalog tables. It requires catalogTableFromConfigs.size() to exactly match the number of entries under ConnectorCommonOptions.TABLE_CONFIGS ('table_configs'); otherwise it throws SeaTunnelRuntimeException with CATALOG_TABLE_SIZE_IS_ERROR.","triggerScenarios":"Using a multi-table file source where the number of resolved CatalogTables derived from table_configs differs from table_configs list size — typically due to an internal mismatch between parsed table metadata and the config list.","commonSituations":"Programmatically constructing BaseMultipleTableFileSourceConfig with a hand-built catalogTableFromConfigs list that doesn't match table_configs; framework/plugin version changes altering how catalog tables are collected; a bug when table_configs contains entries whose schemas fail to parse and are dropped upstream.","solutions":["Ensure every entry under table_configs produces exactly one CatalogTable — check that each table entry has a valid schema (schema.fields) and does not silently fail parsing.","Align the catalogTableFromConfigs list passed to the constructor with the table_configs list (same order and count).","Verify table_paths/table_paths_to_table_name mappings are consistent with table_configs entries.","If triggered inside a supported connector path, report it as a bug with your full config and SeaTunnel version."],"exampleFix":"// before (programmatic)\nnew BaseMultipleTableFileSourceConfig(cfg, catalogTables.subList(0, 2)) // 3 in table_configs\n// after\nnew BaseMultipleTableFileSourceConfig(cfg, catalogTables) // size matches table_configs","handlingStrategy":"validation","validationCode":"List<Map<String,Object>> tableConfigs = rootConfig.get(ConnectorCommonOptions.TABLE_CONFIGS);\nif (catalogTableFromConfigs.size() != tableConfigs.size()) {\n    throw new IllegalArgumentException(\"catalogTables (\" + catalogTableFromConfigs.size()\n        + \") must match table_configs (\" + tableConfigs.size() + \")\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    parseFromFileSourceConfigs(rootConfig, catalogTables);\n} catch (SeaTunnelRuntimeException e) {\n    if (CATALOG_TABLE_SIZE_IS_ERROR.equals(e.getSeaTunnelErrorCode())) {\n        log.error(\"table_configs count != parsed CatalogTable count; check each table entry has a valid schema\", e);\n    }\n    throw e;\n}","preventionTips":["When building configs programmatically, derive catalogTables directly from table_configs instead of maintaining parallel lists.","Validate every table_configs entry parses into a CatalogTable before constructing the multi-table config.","Keep table_paths / table_paths_to_table_name consistent with table_configs order.","Pin a single SeaTunnel version across build/test/prod to avoid parsing-behavior drift."],"tags":["file-connector","multi-table","config-mismatch"],"backgroundTag":"internal-invariant-violation","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}