{"record":{"id":"c2e9693ad5a00d3f","repo":"apache/seatunnel","slug":"sink-don-t-support-simultaneous-writing-of-data-fr","errorCode":null,"errorMessage":"Sink don't support simultaneous writing of data from multi-table source and other sources.","messagePattern":"Sink don't support simultaneous writing of data from multi-table source and other sources\\.","errorType":"validation","errorClass":"JobDefineCheckException","httpStatus":null,"severity":"error","filePath":"seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/parse/MultipleTableJobConfigParser.java","lineNumber":646,"sourceCode":"            ClassLoader classLoader,\n            LinkedHashMap<String, List<Tuple2<CatalogTable, Action>>> tableWithActionMap) {\n\n        ReadonlyConfig readonlyConfig = ReadonlyConfig.fromConfig(sinkConfig);\n        String factoryId = getFactoryId(readonlyConfig);\n        List<String> inputIds = getInputIds(readonlyConfig);\n\n        List<List<Tuple2<CatalogTable, Action>>> inputVertices =\n                inputIds.stream()\n                        .map(tableWithActionMap::get)\n                        .filter(Objects::nonNull)\n                        .collect(Collectors.toList());\n        if (inputVertices.isEmpty()) {\n            // Tolerates incorrect configuration of simple graph\n            inputVertices = Collections.singletonList(findLast(tableWithActionMap));\n        } else if (inputVertices.size() > 1) {\n            for (List<Tuple2<CatalogTable, Action>> inputVertex : inputVertices) {\n                if (inputVertex.size() > 1) {\n                    throw new JobDefineCheckException(\n                            \"Sink don't support simultaneous writing of data from multi-table source and other sources.\");\n                }\n            }\n        }\n\n        // get jar urls\n        Set<URL> jarUrls = new HashSet<>();\n        if (!DryRunSampleConfig.isEnabled(jobConfig.getEnvOptions())) {\n            jarUrls.addAll(getSinkPluginJarPaths(sinkConfig));\n        }\n        List<SinkAction<?, ?, ?, ?>> sinkActions = new ArrayList<>();\n        int failedTableStartIndex = failedTables.size();\n\n        // union\n        if (inputVertices.size() > 1) {\n            Set<Action> inputActions =\n                    inputVertices.stream()\n                            .flatMap(Collection::stream)","sourceCodeStart":628,"sourceCodeEnd":664,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/parse/MultipleTableJobConfigParser.java#L628-L664","documentation":"parseSink rejects a sink whose multiple input vertices include one that is itself a multi-table (catalog-table, action list with >1 entries) input. SeaTunnel only supports a sink either writing from a single multi-table source stream or from regular single-table inputs, not both mixed together.","triggerScenarios":"During parse(), a sink references more than one input vertex in the DAG and at least one of those vertices carries more than one (CatalogTable, Action) pair, i.e. combines multi-table source output with another source/transform.","commonSituations":"A config that unions a multi-table source (table_path matching many tables) with a second source into one sink; wiring multiple parents into one sink node in HOCON graph syntax.","solutions":["Split into separate sinks: one sink consuming the multi-table source and another sink for the other source.","Use union-style transforms per structure, keeping multi-table sources isolated on their own branch.","Restrict multi-table source matching (table_names/table_path) so only one table flows into the mixed sink if merging is intended."],"exampleFix":"// before: one sink with mixed inputs\nsink { Jdbc { ... } }\n// after: two independent sinks\nsink { Jdbc { ... /* fed by multi-table source */ } }\nsink { Console { ... /* fed by the other source */ } }","handlingStrategy":"validation","validationCode":"// don't mix a multi-table source with other inputs on one sink\nboolean multiTable = sourceTables.size() > 1;\nif (multiTable && sinkInputs.size() > 1) {\n  throw new IllegalArgumentException(\"Sink cannot combine multi-table source with other inputs\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  engine.submitJob(config);\n} catch (JobDefineCheckException e) {\n  if (e.getMessage().contains(\"multi-table source and other sources\")) {\n    // split into separate sink branches\n  }\n}","preventionTips":["Keep multi-table sources on a dedicated sink branch","Restrict table_path/table_names so one sink maps to one schema shape","Review DAG parent wiring in graph-style HOCON configs"],"tags":["job-parsing","dag-construction","unsupported-operation","sink-config"],"backgroundTag":"unsupported-operation","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}