{"record":{"id":"dbdd745348c6e397","repo":"hasura/graphql-engine","slug":"duplicate-sql-schema-alias-for-subgraph-subgraph","errorCode":null,"errorMessage":"duplicate SQL schema alias for subgraph '{subgraph}'","messagePattern":"duplicate SQL schema alias for subgraph '(.+?)'","errorType":"validation","errorClass":"SqlSchemaAliasError","httpStatus":null,"severity":"error","filePath":"v3/crates/metadata-resolve/src/stages/sql_schema_aliases/mod.rs","lineNumber":21,"sourceCode":"use open_dds::identifier::SubgraphName;\nuse open_dds::sql_schema_aliases::{SqlCatalogName, SqlSchemaName};\nuse serde::{Deserialize, Serialize};\n\n/// A resolved SQL schema alias: maps a subgraph to a (catalog, schema) pair\n/// for the SQL interface.\n#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]\npub struct SqlSchemaAlias {\n    pub catalog: SqlCatalogName,\n    pub schema: SqlSchemaName,\n}\n\n/// The output of resolving all `SqlSchemaAlias` metadata objects.\n/// Keyed by subgraph name.\npub type SqlSchemaAliases = BTreeMap<SubgraphName, SqlSchemaAlias>;\n\n#[derive(Debug, thiserror::Error)]\npub enum SqlSchemaAliasError {\n    #[error(\"duplicate SQL schema alias for subgraph '{subgraph}'\")]\n    DuplicateMapping { subgraph: SubgraphName },\n}\n\npub fn resolve(\n    metadata_accessor: &open_dds::accessor::MetadataAccessor,\n) -> Result<SqlSchemaAliases, Vec<SqlSchemaAliasError>> {\n    let mut mappings = BTreeMap::new();\n    let mut errors = Vec::new();\n\n    for mapping_obj in &metadata_accessor.sql_schema_aliases {\n        let subgraph: SubgraphName = (&mapping_obj.subgraph).into();\n        let mapping = SqlSchemaAlias {\n            catalog: mapping_obj.catalog.clone(),\n            schema: mapping_obj.schema.clone(),\n        };\n\n        if mappings.insert(subgraph.clone(), mapping).is_some() {\n            errors.push(SqlSchemaAliasError::DuplicateMapping { subgraph });","sourceCodeStart":3,"sourceCodeEnd":39,"githubUrl":"https://github.com/hasura/graphql-engine/blob/724551b9ae87845594ef0408cff0e50eb6c90dc5/v3/crates/metadata-resolve/src/stages/sql_schema_aliases/mod.rs#L3-L39","documentation":"Two SqlSchemaAlias metadata objects map the same subgraph name, which is ambiguous.","triggerScenarios":"Declaring more than one SqlSchemaAlias for the same SubgraphName across the metadata documents.","commonSituations":"Copy-pasting SQL schema alias documents for a new subgraph without changing the subgraph field, or merging projects that both alias the same subgraph.","solutions":["Keep only one SqlSchemaAlias per subgraph and delete the duplicate","Change the subgraph name in one of the alias documents if both are needed for different subgraphs"],"exampleFix":"// before\n# doc1\nkind: SqlSchemaAlias\nsubgraph: marketing\n# doc2\nkind: SqlSchemaAlias\nsubgraph: marketing\n// after\n# doc2 changed\nkind: SqlSchemaAlias\nsubgraph: sales","handlingStrategy":"validation","validationCode":"let mut subgraphs = HashSet::new();\nfor a in &metadata_accessor.sql_schema_aliases {\n    if !subgraphs.insert(a.subgraph.clone()) {\n        return Err(format!(\"duplicate SqlSchemaAlias for {}\", a.subgraph));\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["One alias per subgraph; grep metadata for duplicate kind: SqlSchemaAlias docs before merging projects"],"tags":["duplicate","sql-schema-alias","subgraph","metadata"],"backgroundTag":"duplicate-definition","analyzedSha":"724551b9ae87845594ef0408cff0e50eb6c90dc5","analyzedAt":"2026-08-28T07:32:55.105Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}