{"record":{"id":"7fb21dc09602d829","repo":"risingwavelabs/risingwave","slug":"duplicate-relation-name-0","errorCode":null,"errorMessage":"Duplicate Relation Name: {0}","messagePattern":"Duplicate Relation Name: (.+?)","errorType":"error_code","errorClass":"ErrorCode","httpStatus":null,"severity":"error","filePath":"src/frontend/src/error.rs","lineNumber":157,"sourceCode":"        BoxedError,\n    ),\n    #[error(\"Protocol error: {0}\")]\n    ProtocolError(#[message] String),\n    #[error(\"Scheduler error: {0}\")]\n    SchedulerError(\n        #[source]\n        #[backtrace]\n        BoxedError,\n    ),\n    #[error(\"Task not found\")]\n    TaskNotFound,\n    #[error(\"Session not found\")]\n    SessionNotFound,\n    #[error(\"Invalid reference: {0}\")]\n    InvalidReference(String),\n    #[error(\"Item not found: {0}\")]\n    ItemNotFound(String),\n    #[error(\"Duplicate Relation Name: {0}\")]\n    DuplicateRelationName(String),\n    #[error(\"Invalid insert operation: {0}\")]\n    InsertViolation(String),\n    #[error(\"Invalid input syntax: {0}\")]\n    InvalidInputSyntax(#[message] String),\n    #[error(\"Cannot compare in memory: {0}\")]\n    MemComparableError(#[from] memcomparable::Error),\n    #[error(\"Error while de/se values: {0}\")]\n    ValueEncodingError(\n        #[from]\n        #[backtrace]\n        ValueEncodingError,\n    ),\n    #[error(\"Invalid value `{config_value}` for `{config_entry}`\")]\n    InvalidConfigValue {\n        config_entry: String,\n        config_value: String,\n    },","sourceCodeStart":139,"sourceCodeEnd":175,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/frontend/src/error.rs#L139-L175","documentation":"RisingWave frontend's ErrorCode::DuplicateRelationName variant, rendered as \"Duplicate Relation Name: {0}\". It is raised by the binder when two relations in the same query scope share an implicit alias, e.g. self-joins without aliases or a subquery reusing an existing table alias (src/frontend/src/binder/bind_context.rs:273,294 and src/frontend/src/binder/query.rs:383).","triggerScenarios":"FROM t, t without aliases; joining a subquery whose derived alias collides with an existing relation name; aliasing a second relation with a name already bound in the same scope.","commonSituations":"Self-joins written without AS aliases; template-generated SQL that reuses default aliases; copy-pasted subqueries in large joins.","solutions":["Give each duplicate relation a unique alias (FROM t AS t1, t AS t2).","Rename the colliding subquery alias so it differs from existing relation names.","Search the generated/ORM SQL for repeated AS names and make aliases unique.","If scope is nested intentionally, ensure the duplicate lives in a different subquery scope, not the same FROM list."],"exampleFix":"// before\nSELECT * FROM orders JOIN orders ON orders.id = orders.parent_id;\n// after\nSELECT * FROM orders o JOIN orders p ON o.id = p.parent_id;","handlingStrategy":"validation","validationCode":"// lint SQL: every relation in a FROM list must have a unique alias\nassertUniqueAliases(fromClause);","typeGuard":null,"tryCatchPattern":"try { await db.query(sql) } catch (e) {\n  if (/Duplicate Relation Name/.test(e.message)) { sql = aliasRelations(sql); retry(); }\n  else throw e;\n}","preventionTips":["Always alias relations in self-joins.","Enforce an SQL lint rule rejecting duplicate aliases in one FROM list.","Use distinct, meaningful aliases for generated subqueries."],"tags":["sql","binder","risingwave","alias"],"backgroundTag":"invalid-argument-value","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}