{"record":{"id":"8db0e284222a4093","repo":"apache/cassandra","slug":"duplicate-field-name-s-in-type-s","errorCode":null,"errorMessage":"Duplicate field name %s in type %s","messagePattern":"Duplicate field name (.+?) in type (.+?)","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/statements/schema/AlterTypeStatement.java","lineNumber":237,"sourceCode":"\n            List<FieldIdentifier> fieldNames = new ArrayList<>(userType.fieldNames());\n\n            renamedFields.forEach((oldName, newName) ->\n            {\n                int idx = userType.fieldPosition(oldName);\n                if (idx < 0)\n                {\n                    if (!ifFieldExists)\n                        throw ire(\"Unkown field %s in user type %s\", oldName, userType.getCqlTypeName());\n                    return;\n                }\n                fieldNames.set(idx, newName);\n            });\n\n            fieldNames.forEach(name ->\n            {\n                if (fieldNames.stream().filter(isEqual(name)).count() > 1)\n                    throw ire(\"Duplicate field name %s in type %s\", name, keyspaceName, userType.getCqlTypeName());\n            });\n\n            return new UserType(keyspaceName, userType.name, fieldNames, userType.fieldTypes(), true);\n        }\n    }\n\n    private static final class AlterField extends AlterTypeStatement\n    {\n        private AlterField(String keyspaceName, String typeName, boolean ifExists)\n        {\n            super(keyspaceName, typeName, ifExists);\n        }\n\n        @Override\n        public boolean compatibleWith(ClusterMetadata metadata)\n        {\n            return metadata.directory.commonSerializationVersion.isAtLeast(Version.V0);\n        }","sourceCodeStart":219,"sourceCodeEnd":255,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/statements/schema/AlterTypeStatement.java#L219-L255","documentation":"After applying renames, Cassandra verifies that no two fields of the UDT share the same name; if any duplicate exists the rename is rejected. This prevents producing a UDT with ambiguous field names, which would break field lookup and serialization. Note the format string takes two placeholders but three arguments (keyspaceName extra) — the message rendered is 'Duplicate field name <name> in type <keyspaceName>'.","triggerScenarios":"`ALTER TYPE myks.t RENAME a TO b` when the type already has a field `b` (the renamed field collides with an existing one); renaming two different fields to the same new name in one statement.","commonSituations":"Adding a field later with the name a rename will eventually target; bulk rename scripts where target names were not deduplicated; case variants (\"b\" vs b) overlooked since unquoted identifiers fold to lowercase.","solutions":["Pick a distinct new name that does not already exist on the type; check existing fields via DESCRIBE TYPE first","Rename in two steps via intermediate unique names, e.g. a TO a_tmp, then a_tmp TO b after renaming/removing the conflicting field","Remove or rename the conflicting existing field before reusing its name"],"exampleFix":"// before\nALTER TYPE myks.t RENAME a TO b; -- type already has field b\n// after\nALTER TYPE myks.t RENAME a TO a2; -- or drop/rename field b first","handlingStrategy":"validation","validationCode":"// Ensure the target name is not already a field:\nRow typeRow = session.execute(\"SELECT field_names FROM system_schema.types WHERE keyspace_name='myks' AND type_name='t'\").one();\nSet<String> names = new HashSet<>(typeRow.getList(\"field_names\", String.class));\nif (names.contains(\"b\")) throw new IllegalArgumentException(\"field 'b' already exists on t\");","typeGuard":null,"tryCatchPattern":"try { session.execute(renameCql); }\ncatch (InvalidQueryException e) {\n    if (e.getMessage().startsWith(\"Duplicate field name\")) { /* choose a unique target name */ }\n    else throw e;\n}","preventionTips":["Check existing field names before choosing rename targets","Deduplicate target names when renaming multiple fields in one statement","Generate migration scripts from the live schema (system_schema.types) rather than from memory"],"tags":["cassandra","cql","udt","rename","duplicate"],"backgroundTag":"schema-validation-failed","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}