risingwavelabs/risingwave · error
Snowflake catalog only supports iceberg sources
Error message
Snowflake catalog only supports iceberg sources
What it means
Iceberg sink validation rejects the Snowflake catalog kind because this sink path is only wired for storage-backed catalogs that the sink connector can write to (e.g. Glue, JDBC, REST, storage catalogs). Snowflake catalogs are supported on the Iceberg source side only, so a sink configured with a Snowflake catalog fails validation.
Source
Thrown at src/connector/src/sink/iceberg/mod.rs:230
const SINK_NAME: &'static str = ICEBERG_SINK;
crate::impl_validate_sink_unknown_fields!();
fn is_exactly_once(properties: &BTreeMap<String, String>) -> Result<bool> {
let Some(value) = properties.get("is_exactly_once") else {
return Ok(true);
};
value.parse::<bool>().map_err(|_| {
SinkError::Config(anyhow!(
"invalid value for `is_exactly_once`: expected `true` or `false`, got `{value}`"
))
})
}
async fn validate(&self) -> Result<()> {
let catalog_kind = self.config.catalog_kind()?;
if matches!(catalog_kind, IcebergCatalogKind::Snowflake) {
bail!("Snowflake catalog only supports iceberg sources");
}
if matches!(catalog_kind, IcebergCatalogKind::Glue(_)) {
risingwave_common::license::Feature::IcebergSinkWithGlue
.check_available()
.map_err(|e| anyhow::anyhow!(e))?;
}
// Enforce merge-on-read for append-only tables
IcebergConfig::validate_append_only_write_mode(
&self.config.r#type,
self.config.write_mode,
)?;
validate_explicit_compaction_type(&self.config)?;
validate_compaction_option_compatibility(&self.config)?;
// VARIANT is not comparable, so it can never be an equality-delete key.
if self.config.r#type == SINK_TYPE_UPSERTView on GitHub (pinned to 6469eb736d)
Solutions
- Use a supported sink catalog (e.g. Glue, JDBC/Postgres, REST/Hive, or storage catalog) in the sink's catalog config.
- Keep the Snowflake catalog for Iceberg sources only, and maintain a separate sink catalog config.
- Check the RisingWave docs/release notes for whether sink-side Snowflake catalog support has been added since your version.
Example fix
-- before WITH (connector='iceberg', catalog.type='snowflake', ...) -- after WITH (connector='iceberg', catalog.type='glue', catalog.warehouse='s3://bucket/path', ...)
Defensive patterns
Strategy: validation
Validate before calling
-- pre-check catalog type before creating an iceberg sink SELECT CASE WHEN properties ->> 'catalog.type' = 'snowflake' THEN 'ERROR: snowflake catalog not supported for iceberg sinks' ELSE 'ok' END FROM rw_sinks;
Prevention
- Maintain separate catalog configs for iceberg sources (snowflake ok) vs sinks (glue/jdbc/rest/storage).
- Check current release notes for which sink catalog kinds are supported.
- Validate sink DDL with a small test sink before production rollout.
When it happens
Trigger: Creating an Iceberg sink whose catalog config resolves `catalog_kind()` to `IcebergCatalogKind::Snowflake` (e.g. `catalog.type = 'snowflake'` or a Snowflake-flavored catalog URI).
Common situations: Reusing a working Snowflake Iceberg source catalog config for a sink; assuming source-side Snowflake catalog support implies sink-side support; a version change that flipped catalog support.
Understand the failure class
Background: "is not a compatible type" / "cannot merge" errors: when a value's type doesn't match what the library requires — this error's family across 65 libraries.
Related errors
- failed to create iceberg namespace: {namespace}
- Only AddColumns schema change is supported for Snowflake sin
- support negative scale for arrow decimal
- `catalog.type` must be set
- Failed to list iceberg namespaces.
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/d10f269bb4858c9f.
Report an issue: GitHub.