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_UPSERT

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Use a supported sink catalog (e.g. Glue, JDBC/Postgres, REST/Hive, or storage catalog) in the sink's catalog config.
  2. Keep the Snowflake catalog for Iceberg sources only, and maintain a separate sink catalog config.
  3. 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

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


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