risingwavelabs/risingwave · error · SinkError

(dynamic: SnowflakeSink license feature unavailable)

Error message

(dynamic: SnowflakeSink license feature unavailable)

What it means

`SnowflakeSink::validate` first checks that the `SnowflakeSink` licensed feature is available via `risingwave_common::license::Feature::SnowflakeSink.check_available()`. If the deployment lacks the required license entitlement, validation fails before any connection is attempted, wrapping the license error message.

Solutions

  1. Install or update the RisingWave license key that includes the Snowflake sink feature (`ALTER SYSTEM SET license_key = ...`)
  2. If Snowflake is not needed, choose a sink connector covered by the current license
  3. Contact RisingWave sales/support to enable the SnowflakeSink entitlement

Example fix

-- before
CREATE SINK s INTO snowflake WITH (connector='snowflake', ...); -- license error
-- after
ALTER SYSTEM SET license_key = '<key-with-snowflake-feature>';
CREATE SINK s INTO snowflake WITH (connector='snowflake', ...);
Defensive patterns

Strategy: try-catch

Validate before calling

if !risingwave_common::license::Feature::SnowflakeSink.is_available() {
    // skip snowflake sink creation or prompt for license
}

Try / catch

match snowflake_sink.validate().await {
    Err(e) if e.to_string().contains("license") => {
        eprintln!("Snowflake sink requires an enterprise license: {e}");
    }
    Err(e) => return Err(e),
    Ok(()) => { /* proceed */ }
}

Prevention

When it happens

Trigger: Creating or validating a Snowflake sink on a RisingWave deployment whose license does not include the SnowflakeSink feature (e.g. trial/basic license without the enterprise feature enabled).

Common situations: Enterprise feature used without setting a license key; expired or downgraded license; running an open-source build where the feature is not enabled.

Related errors


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

Appendix: source

Thrown at src/connector/src/sink/snowflake_redshift/snowflake.rs:507

            schema,
            pk_indices,
            is_append_only,
            param,
        })
    }
}

impl Sink for SnowflakeV2Sink {
    type LogSinker = CoordinatedLogSinker<SnowflakeSinkWriter>;

    const SINK_NAME: &'static str = SNOWFLAKE_SINK_V2;

    crate::impl_validate_sink_unknown_fields!();

    async fn validate(&self) -> Result<()> {
        risingwave_common::license::Feature::SnowflakeSink
            .check_available()
            .map_err(|e| anyhow::anyhow!(e))?;
        if let Some((snowflake_task_ctx, client)) =
            self.config.build_snowflake_task_ctx_jdbc_client(
                self.is_append_only,
                &self.schema,
                &self.pk_indices,
            )?
        {
            let client = SnowflakeJniClient::new(client, snowflake_task_ctx);
            client.execute_create_table().await?;
            client.execute_create_pipe().await?;
        }

        Ok(())
    }

    fn support_schema_change() -> bool {
        true
    }

View on GitHub (pinned to 6469eb736d)