{"record":{"id":"fe29d7fce0b9acc2","repo":"NationalSecurityAgency/ghidra","slug":"equate-already-exists","errorCode":null,"errorMessage":"Equate already exists: {}","messagePattern":"Equate already exists: (.+?)","errorType":"validation","errorClass":"DuplicateNameException","httpStatus":null,"severity":"warning","filePath":"Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/symbol/DBTraceEquateManager.java","lineNumber":124,"sourceCode":"\t@Override\n\tprotected DBTraceEquateSpace createSpace(AddressSpace space, DBTraceSpaceEntry ent)\n\t\t\tthrows VersionException, IOException {\n\t\treturn new DBTraceEquateSpace(this, dbh, space, ent);\n\t}\n\n\t@Override\n\tpublic DBTraceEquateSpace getForSpace(AddressSpace space, boolean createIfAbsent) {\n\t\treturn super.getForSpace(space, createIfAbsent);\n\t}\n\n\t@Override\n\tpublic DBTraceEquate create(String newName, long value)\n\t\t\tthrows DuplicateNameException, IllegalArgumentException {\n\t\tTraceEquateManager.validateName(newName);\n\t\ttry (LockHold hold = LockHold.lock(lock.writeLock())) {\n\t\t\tDBTraceEquate equate = equatesByName.getOne(newName);\n\t\t\tif (equate != null) {\n\t\t\t\tthrow new DuplicateNameException(\"Equate already exists: \" + newName);\n\t\t\t}\n\t\t\tequate = equateStore.create();\n\t\t\tequate.set(newName, value);\n\t\t\treturn equate;\n\t\t}\n\t}\n\n\t@Override\n\tpublic Collection<? extends DBTraceEquate> getAll() {\n\t\treturn equateView;\n\t}\n\n\t@Override\n\tpublic DBTraceEquate getByName(String equateName) {\n\t\treturn equatesByName.getOne(equateName);\n\t}\n\n\t@Override","sourceCodeStart":106,"sourceCodeEnd":142,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/symbol/DBTraceEquateManager.java#L106-L142","documentation":"Thrown as DuplicateNameException by DBTraceEquateManager.create when an equate with the given name already exists in equatesByName. Equate names must be unique per trace. Note the name is also validated by TraceEquateManager.validateName before the duplicate check, so an invalid name throws earlier.","triggerScenarios":"Two calls to create(\"FOO\", value) on the same trace; re-running an import that registers equates; an equate name colliding with a pre-existing one loaded from the trace.","commonSituations":"Idempotent scripts that do not check existence; concurrent equate creation from multiple plugins; replayed recordings.","solutions":["Use getEquate(name) first and update its value instead of creating.","Catch DuplicateNameException and fall back to the existing equate.","Namespace equate names per importer to avoid collisions."],"exampleFix":"// before\nDBTraceEquate eq = mgr.create(\"FOO\", 1);\n// after\nDBTraceEquate eq = mgr.getByName(\"FOO\");\nif (eq == null) eq = mgr.create(\"FOO\", 1);\nelse eq.setValue(1);","handlingStrategy":"try-catch","validationCode":"DBTraceEquate existing = mgr.getByName(name);\nif (existing != null) { existing.setValue(value); return existing; }\nreturn mgr.create(name, value);","typeGuard":null,"tryCatchPattern":"try { return mgr.create(name, value); }\ncatch (DuplicateNameException e) { return mgr.getByName(name); }","preventionTips":["Check getByName before create for idempotent scripts.","Namespace equate names per importer."],"tags":["equate","duplicate","checked-exception"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}