{"record":{"id":"03e02e824a1e235b","repo":"risingwavelabs/risingwave","slug":"warehouse-path-must-be-set-in-storage-catalog","errorCode":null,"errorMessage":"`warehouse.path` must be set in storage catalog","messagePattern":"`warehouse\\.path` must be set in storage catalog","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/connector/src/connector_common/iceberg/mod.rs","lineNumber":617,"sourceCode":"                );\n            }\n            return false;\n        }\n        self.enable_config_load.unwrap_or(false)\n    }\n\n    fn effective_s3_path_style_access(&self) -> bool {\n        // RisingWave historically inherited OpenDAL's path-style default. Iceberg now\n        // defaults to virtual-host style, so preserve existing connector behavior unless\n        // the user explicitly opts into virtual-host style with `false`.\n        self.s3_path_style_access.unwrap_or(true)\n    }\n\n    fn build_storage_catalog_config(&self) -> ConnectorResult<CatalogBuildPlan> {\n        let warehouse = self\n            .warehouse_path\n            .clone()\n            .ok_or_else(|| anyhow!(\"`warehouse.path` must be set in storage catalog\"))?;\n        let url = Url::parse(warehouse.as_ref())\n            .map_err(|_| anyhow!(\"Invalid warehouse path: {}\", warehouse))?;\n\n        let config = match url.scheme() {\n            \"s3\" | \"s3a\" => StorageCatalogConfig::S3(\n                storage_catalog::StorageCatalogS3Config::builder()\n                    .warehouse(warehouse)\n                    .access_key(self.s3_access_key.clone())\n                    .secret_key(self.s3_secret_key.clone())\n                    .region(self.s3_region.clone())\n                    .endpoint(self.s3_endpoint.clone())\n                    .path_style_access(Some(self.effective_s3_path_style_access()))\n                    .enable_config_load(Some(self.enable_config_load()))\n                    .build(),\n            ),\n            \"gs\" | \"gcs\" => StorageCatalogConfig::Gcs(\n                storage_catalog::StorageCatalogGcsConfig::builder()\n                    .warehouse(warehouse)","sourceCodeStart":599,"sourceCodeEnd":635,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/connector_common/iceberg/mod.rs#L599-L635","documentation":"When `catalog.type = 'storage'`, the warehouse location is mandatory because the storage catalog writes table metadata directly under the warehouse path. `build_storage_catalog_config` bails if `warehouse.path` is absent.","triggerScenarios":"Creating an Iceberg table/sink with `catalog.type = 'storage'` but no `warehouse.path` in the with-options.","commonSituations":"Users migrating config from REST/Glue catalogs where warehouse is optional or inferred; renamed option (older docs used different keys); simply forgetting the property.","solutions":["Add `warehouse.path` pointing to the object-store root, e.g. 's3://bucket/path/to/warehouse'.","Ensure the value is a full URL with scheme (s3, s3a, azblob) — see also the companion 'Invalid warehouse path' error.","If you meant a catalog that derives the warehouse, use rest/glue instead of storage."],"exampleFix":"// before\nwith ( connector='iceberg', catalog.type='storage' )\n// after\nwith (\n  connector='iceberg',\n  catalog.type='storage',\n  warehouse.path='s3://my-bucket/warehouse'\n)","handlingStrategy":"validation","validationCode":"if (catalogType === 'storage' && !opts['warehouse.path']) {\n  throw new Error(\"`warehouse.path` must be set in storage catalog\");\n}","typeGuard":null,"tryCatchPattern":"catch (e) { if (String(e).includes('warehouse.path')) { /* prompt user for warehouse.path and retry creation */ } else { throw e; } }","preventionTips":["Treat warehouse.path as required whenever catalog.type='storage'.","Keep a schema of required per-catalog-type options and validate DDL in CI.","When migrating from other catalogs, audit options against the storage-catalog checklist."],"tags":["iceberg","storage-catalog","missing-config"],"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"}