{"record":{"id":"34991801d43e877b","repo":"risingwavelabs/risingwave","slug":"unknown-sink-connector-sink-name-349918","errorCode":null,"errorMessage":"Unknown sink connector: {sink_name}","messagePattern":"Unknown sink connector: (.+?)","errorType":"validation","errorClass":"ConnectorError","httpStatus":null,"severity":"error","filePath":"src/connector/src/with_options_test.rs","lineNumber":858,"sourceCode":"}}\n\n/// Checks if all given fields are allowed to be altered on the fly for the specified sink connector.\n/// Returns Ok(()) if all fields are allowed, otherwise returns a `ConnectorError`.\npub fn check_sink_allow_alter_on_fly_fields(\n    sink_name: &str,\n    fields: &[String],\n) -> crate::error::ConnectorResult<()> {{\n    // TODO(#24846): JDBC sink currently uses `()` as sink config type in `for_all_sinks!`,\n    // so it cannot have an isolated key in `SINK_ALLOW_ALTER_ON_FLY_FIELDS`.\n    // Reuse the JDBC entry in `CONNECTION_ALLOW_ALTER_ON_FLY_FIELDS` for now.\n    // TODO(#24846): remove this special case after JDBC sink has a dedicated config type\n    // and allow-alter fields are generated directly into `SINK_ALLOW_ALTER_ON_FLY_FIELDS`.\n    let allowed_fields = if sink_name == JdbcSink::SINK_NAME {{\n        CONNECTION_ALLOW_ALTER_ON_FLY_FIELDS.get(JdbcSink::SINK_NAME)\n    }} else {{\n        // Convert sink name to the type name key\n        let Some(type_name) = sink_properties::sink_name_to_config_type_name(sink_name) else {{\n            return Err(ConnectorError::from(anyhow::anyhow!(\n                \"Unknown sink connector: {{sink_name}}\"\n            )));\n        }};\n        SINK_ALLOW_ALTER_ON_FLY_FIELDS.get(type_name)\n    }};\n    let Some(allowed_fields) = allowed_fields else {{\n        return Err(ConnectorError::from(anyhow::anyhow!(\n            \"No allow_alter_on_fly fields registered for sink: {{sink_name}}\"\n        )));\n    }};\n    for field in fields {{\n        if !allowed_fields.contains(field) {{\n            return Err(ConnectorError::from(anyhow::anyhow!(\n                \"Field '{{field}}' is not allowed to be altered on the fly for sink: {{sink_name}}\"\n            )));\n        }}\n    }}\n    Ok(())","sourceCodeStart":840,"sourceCodeEnd":876,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/with_options_test.rs#L840-L876","documentation":"Raised by check_sink_allow_alter_on_fly_fields when the sink name is neither the special JdbcSink name nor resolvable via sink_properties::sink_name_to_config_type_name, so no sink type key can be derived for the registry lookup.","triggerScenarios":"Calling the sink allow-alter-on-fly validation with an unknown sink name, such as a typo in CREATE SINK connector name or a sink type from a different RisingWave version.","commonSituations":"Typo in sink connector ('s3' vs 'snowflake' etc.); using a name valid only as a source; sink type renamed/removed across versions.","solutions":["Check spelling against the registered sink names in sink_properties.","Use an officially supported sink connector name (e.g. 'kafka', 'jdbc', 'snowflake', 'clickhouse', 'elasticsearch').","If adding a new sink, register it in sink_name_to_config_type_name and generate its allow fields.","Align frontend/connector crate versions so both know the sink name."],"exampleFix":"// before\ncheck_sink_allow_alter_on_fly_fields(\"kafkas\", &fields)?;\n// after\ncheck_sink_allow_alter_on_fly_fields(\"kafka\", &fields)?;","handlingStrategy":"validation","validationCode":"fn is_known_sink(name: &str) -> bool {\n    name == JdbcSink::SINK_NAME\n        || risingwave_connector::sink::sink_properties::sink_name_to_config_type_name(name).is_some()\n}","typeGuard":null,"tryCatchPattern":"match check_sink_allow_alter_on_fly_fields(sink, &fields) {\n    Ok(()) => {},\n    Err(e) => eprintln!(\"sink '{}' not recognized: {}\", sink, e),\n}","preventionTips":["Copy sink connector names from official docs","Keep all crates on the same version","Validate sink names at planning time"],"tags":["sink","connector","unknown-identifier"],"backgroundTag":"entity-not-found","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}