risingwavelabs/risingwave · error

Unsupported warehouse scheme: {}

Error message

Unsupported warehouse scheme: {}

What it means

After successfully parsing the warehouse URL, `build_storage_catalog_config` matches the URL scheme against supported object stores (s3/s3a, azblob). Any other scheme hits the catch-all `scheme => bail!` arm, so the storage catalog only supports those backends.

Source

Thrown at src/connector/src/connector_common/iceberg/mod.rs:648

                    .enable_config_load(Some(self.enable_config_load()))
                    .build(),
            ),
            "gs" | "gcs" => StorageCatalogConfig::Gcs(
                storage_catalog::StorageCatalogGcsConfig::builder()
                    .warehouse(warehouse)
                    .credential(self.gcs_credential.clone())
                    .enable_config_load(Some(self.enable_config_load()))
                    .build(),
            ),
            "azblob" => StorageCatalogConfig::Azblob(
                storage_catalog::StorageCatalogAzblobConfig::builder()
                    .warehouse(warehouse)
                    .account_name(self.azblob_account_name.clone())
                    .account_key(self.azblob_account_key.clone())
                    .endpoint(self.azblob_endpoint_url.clone())
                    .build(),
            ),
            scheme => bail!("Unsupported warehouse scheme: {}", scheme),
        };

        Ok(CatalogBuildPlan::Storage(config))
    }

    fn build_native_rest_catalog_props(&self) -> ConnectorResult<CatalogBuildPlan> {
        let mut iceberg_configs = HashMap::new();

        // check gcs credential or s3 access key and secret key
        if let Some(gcs_credential) = &self.gcs_credential {
            iceberg_configs.insert(GCS_CREDENTIALS_JSON.to_owned(), gcs_credential.clone());
        } else {
            if let Some(region) = &self.s3_region {
                iceberg_configs.insert(S3_REGION.to_owned(), region.clone());
            }
            if let Some(endpoint) = &self.s3_endpoint {
                iceberg_configs.insert(S3_ENDPOINT.to_owned(), endpoint.clone());
            }

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Use a supported scheme: s3://, s3a://, or azblob-compatible URL.
  2. For GCS or other stores, switch to `catalog.type = 'rest'` (via an S3-compatible/GCS REST gateway) or a catalog type that supports the backend.
  3. Check for typos ('s3a' vs 's3aa').

Example fix

// before
warehouse.path = 'gs://my-bucket/warehouse'
// after
warehouse.path = 's3://my-bucket/warehouse'
Defensive patterns

Strategy: validation

Validate before calling

const scheme = new URL(opts['warehouse.path']).protocol.replace(':','');
if (!['s3','s3a','azblob'].includes(scheme)) {
  throw new Error(`Unsupported warehouse scheme: ${scheme}`);
}

Try / catch

catch (e) { if (String(e).includes('Unsupported warehouse scheme')) { /* fall back to rest catalog or s3-compatible endpoint */ } else { throw e; } }

Prevention

When it happens

Trigger: `warehouse.path` with schemes like 'gs://' (GCS), 'file://', 'oss://', or 'http://' while `catalog.type = 'storage'`.

Common situations: GCS users assuming storage-catalog parity with S3; local development attempts with file://; provider-specific schemes copied from other tools (oss, cos).

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11). Data as JSON: /api/errors/257433b16ca9bff7. Report an issue: GitHub.