{"record":{"id":"5529c8d6d0755988","repo":"apache/seatunnel","slug":"tables-configs-d-duplicate-schema-table-value","errorCode":null,"errorMessage":"tables_configs[%d]: duplicate 'schema.table' value '%s'","messagePattern":"tables_configs\\[(.+?)\\]: duplicate 'schema\\.table' value '(.+?)'","errorType":"validation","errorClass":"OptionValidationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-neo4j/src/main/java/org/apache/seatunnel/connectors/seatunnel/neo4j/source/Neo4jSourceFactory.java","lineNumber":225,"sourceCode":"                }\n\n                Object schemaValue = entry.get(ConnectorCommonOptions.SCHEMA.key());\n                if (!(schemaValue instanceof Map) || ((Map<?, ?>) schemaValue).isEmpty()) {\n                    throw new OptionValidationException(\n                            \"tables_configs[%d]: 'schema' must be configured and non-empty\", i);\n                }\n\n                Object tableValue =\n                        ((Map<?, ?>) schemaValue).get(ConnectorCommonOptions.TABLE.key());\n                if (!(tableValue instanceof String) || ((String) tableValue).trim().isEmpty()) {\n                    throw new OptionValidationException(\n                            \"tables_configs[%d]: 'schema.table' must be configured and non-blank\",\n                            i);\n                }\n\n                String tableId = ((String) tableValue).trim();\n                if (!tableIds.add(tableId)) {\n                    throw new OptionValidationException(\n                            \"tables_configs[%d]: duplicate 'schema.table' value '%s'\", i, tableId);\n                }\n            }\n            return true;\n        }\n    }\n}\n","sourceCodeStart":207,"sourceCodeEnd":233,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-neo4j/src/main/java/org/apache/seatunnel/connectors/seatunnel/neo4j/source/Neo4jSourceFactory.java#L207-L233","documentation":"tables_configs entries must each resolve to a unique table name. The factory collects trimmed schema.table values into a Set and throws OptionValidationException when a duplicate table name is encountered, because two entries writing/reading the same table would conflict.","triggerScenarios":"Two or more tables_configs entries whose trimmed schema.table values are identical (tableIds.add(tableId) returns false on the second occurrence).","commonSituations":"Copy-pasting an entry and forgetting to change the table name; running the same query twice with different column projections but the same table name; generated configs expanding a list with a constant table name.","solutions":["Give each tables_configs entry a distinct schema.table name.","Remove the duplicated entry if it is an accidental copy.","If the same data is needed twice, use different table names and adjust downstream logic."],"exampleFix":"// before\ntables_configs = [\n  { query = \"...\", schema = { table = \"person\", ... } }\n  { query = \"MATCH (n:Person) WHERE n.age > 30 RETURN ...\", schema = { table = \"person\", ... } }\n]\n// after\ntables_configs = [\n  { query = \"...\", schema = { table = \"person\", ... } }\n  { query = \"MATCH (n:Person) WHERE n.age > 30 RETURN ...\", schema = { table = \"person_over_30\", ... } }\n]","handlingStrategy":"validation","validationCode":"def seen = [] as Set\ntables_configs.eachWithIndex { entry, i ->\n  def t = entry.schema?.table?.trim()\n  if (!seen.add(t)) {\n    throw new IllegalArgumentException(\"duplicate schema.table '${t}' at tables_configs[${i}]\")\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep table names unique across entries.","When copy-pasting entries, immediately change the table name.","Add a pre-submit uniqueness check in config generation tooling."],"tags":["neo4j","config-validation","duplicate-table"],"backgroundTag":"invalid-config-value","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"}