{"record":{"id":"a04836e6fcc5b706","repo":"risingwavelabs/risingwave","slug":"warehouse-path-must-be-set","errorCode":null,"errorMessage":"`warehouse.path` must be set","messagePattern":"`warehouse\\.path` must be set","errorType":"validation","errorClass":"ConnectorError","httpStatus":null,"severity":"error","filePath":"src/connector/src/connector_common/connection.rs","lineNumber":209,"sourceCode":"                    None\n                } else {\n                    let url =\n                        url.with_context(|| format!(\"Invalid warehouse path: {}\", warehouse_path))?;\n                    let bucket = url\n                        .host_str()\n                        .with_context(|| {\n                            format!(\"Invalid s3 path: {}, bucket is missing\", warehouse_path)\n                        })?\n                        .to_owned();\n                    let root = url.path().trim_start_matches('/').to_owned();\n                    Some((url.scheme().to_owned(), bucket, root))\n                }\n            }\n            None => {\n                if is_rest_catalog {\n                    None\n                } else {\n                    bail!(\"`warehouse.path` must be set\");\n                }\n            }\n        };\n\n        // Test warehouse\n        if let Some((scheme, bucket, root)) = info {\n            match scheme.as_str() {\n                \"s3\" | \"s3a\" => {\n                    let mut builder = S3::default();\n                    if let Some(region) = &common.s3_region {\n                        builder = builder.region(region);\n                    }\n                    if let Some(endpoint) = &common.s3_endpoint {\n                        builder = builder.endpoint(endpoint);\n                    }\n                    if let Some(access_key) = &common.s3_access_key {\n                        builder = builder.access_key_id(access_key);\n                    }","sourceCodeStart":191,"sourceCodeEnd":227,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/connector_common/connection.rs#L191-L227","documentation":"Raised in `IcebergConnection::validate_connection` when `warehouse.path` is absent and the configured catalog is not a REST catalog. For non-REST (e.g. JDBC/Hive/Glue) catalogs the warehouse location is mandatory, so validation bails early. REST catalogs may omit it because the server can supply/resolve the warehouse.","triggerScenarios":"Calling validate_connection (during CREATE CONNECTION/SOURCE/SINK validation) on an Iceberg connection where `warehouse.path` is unset and `catalog.type` resolves to something other than REST.","commonSituations":"Forgetting `warehouse.path` in the Iceberg connection options; assuming a JDBC or Hive catalog can infer the warehouse; copying a REST-catalog example config (which omits warehouse.path) while switching to a non-REST catalog.","solutions":["Add the `warehouse.path` option pointing at the table storage location, e.g. `s3://bucket/path` or `gs://bucket/path`.","Alternatively, use a REST catalog (`catalog.type='rest'`) so the warehouse can be omitted or resolved by the server.","Verify the option key spelling is exactly `warehouse.path`."],"exampleFix":"// before\nWITH (connector='iceberg', catalog.type='jdbc', catalog.uri='jdbc:mysql://...')\n// after\nWITH (connector='iceberg', catalog.type='jdbc', catalog.uri='jdbc:mysql://...', warehouse.path='s3://my-bucket/warehouse')","handlingStrategy":"validation","validationCode":"if warehouse_path.is_none() && catalog_type != Some(\"rest\") {\n    return Err(\"warehouse.path is required unless catalog.type='rest'\");\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = conn.validate_connection().await {\n    if e.to_string().contains(\"`warehouse.path` must be set\") {\n        return Err(UserError::MissingOption(\"warehouse.path\"));\n    }\n    return Err(e.into());\n}","preventionTips":["Include warehouse.path in every Iceberg connection template","Only omit it for REST catalogs","Validate option keys against the documented schema before CREATE"],"tags":["iceberg","validation","missing-option","warehouse"],"backgroundTag":"missing-required-config-field","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"}