risingwavelabs/risingwave · error · SinkError::Config

unsupported sink connector {}

Error message

unsupported sink connector {}

What it means

`sink_is_exactly_once` dispatches the lowercased connector name through `match_sink_name_str!`; if the name is not a known sink connector, the fallback arm returns this Config error. It means the connector string is recognized syntactically but not a supported sink type.

Source

Thrown at src/connector/src/sink/mod.rs:272

/// same downstream primary key instead of compacting them into one final-state update within a
/// barrier. Upstream changes under the same stream key may still be compacted earlier.
pub const SINK_USER_PRESERVE_ROW_LEVEL_CHANGES: &str = "preserve_row_level_changes";

/// Return whether the configured sink uses exactly-once commit state.
///
/// Connector dispatch is centralized here, while each [`Sink`] implementation owns the
/// interpretation and default of its properties.
pub fn sink_is_exactly_once(properties: &BTreeMap<String, String>) -> Result<bool> {
    let sink_type = properties
        .get(CONNECTOR_TYPE_KEY)
        .ok_or_else(|| SinkError::Config(anyhow!("missing config: {}", CONNECTOR_TYPE_KEY)))?
        .to_lowercase();

    match_sink_name_str!(
        sink_type.as_str(),
        SinkType,
        SinkType::is_exactly_once(properties),
        |other| Err(SinkError::Config(anyhow!(
            "unsupported sink connector {}",
            other
        )))
    )
}

pub trait UnknownFields {
    /// Unrecognized fields in the `WITH` clause.
    fn unknown_fields(&self) -> HashMap<String, String>;
}

impl UnknownFields for () {
    fn unknown_fields(&self) -> HashMap<String, String> {
        HashMap::new()
    }
}

impl UnknownFields for HashMap<String, String> {

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Correct the connector name to a supported sink connector (kafka, iceberg, jdbc, etc.)
  2. Run `SHOW SINKS`/check docs for the list of supported sink connectors in this version
  3. If the connector should be supported, ensure the corresponding feature flag is enabled

Example fix

// before
WITH (connector = 'kafak')
// after
WITH (connector = 'kafka')
Defensive patterns

Strategy: validation

Validate before calling

const SUPPORTED_SINKS: &[&str] = &["kafka", "iceberg", "jdbc", /* ... */];
let conn = properties.get("connector").map(|s| s.to_lowercase()).unwrap_or_default();
if !SUPPORTED_SINKS.contains(&conn.as_str()) {
    return Err(anyhow!("unsupported sink connector {conn}"));
}

Try / catch

match sink_is_exactly_once(&props) {
    Ok(v) => v,
    Err(e) if e.to_string().contains("unsupported sink connector") => {
        bail!("check connector name against supported sink list; got: {e}");
    }
    Err(e) => return Err(e.into()),
}

Prevention

When it happens

Trigger: Calling `sink_is_exactly_once` (or `prepare_replace_sink` on it) with `connector` set to an unknown/typo'd name, e.g. `connector='kafak'` or a source-only connector name.

Common situations: Typo in DDL WITH clause; using a connector available for sources but not sinks; connector feature disabled at compile time or in the deployed version.

Related errors


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