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
- Correct the connector name to a supported sink connector (kafka, iceberg, jdbc, etc.)
- Run `SHOW SINKS`/check docs for the list of supported sink connectors in this version
- 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
- Copy connector names from the official docs, not from memory
- Distinguish source-only connectors from sink-capable ones
- Keep a checked-in list of valid sink connector names for CI validation
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
- connector '{}' is not supported
- `{}` must be {}, or {}
- Primary key not defined for upsert doris sink (please define
- Can't get fe host from url
- please set only one of the 'index_column' or 'index' propert
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/ba233b243fbbd059.
Report an issue: GitHub.