{"record":{"id":"ad191d5a7d8c8651","repo":"risingwavelabs/risingwave","slug":"no-allow-alter-on-fly-fields-registered-for-sink-ad191d","errorCode":null,"errorMessage":"No allow_alter_on_fly fields registered for sink: {sink_name}","messagePattern":"No allow_alter_on_fly fields registered for sink: (.+?)","errorType":"validation","errorClass":"ConnectorError","httpStatus":null,"severity":"error","filePath":"src/connector/src/with_options_test.rs","lineNumber":865,"sourceCode":") -> 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(())\n}}\n\"#,\n        source_entries = source_entries,\n        sink_entries = sink_entries\n    )\n}\n","sourceCodeStart":847,"sourceCodeEnd":883,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/with_options_test.rs#L847-L883","documentation":"Raised when the sink name resolves (or is JdbcSink) but neither CONNECTION_ALLOW_ALTER_ON_FLY_FIELDS nor SINK_ALLOW_ALTER_ON_FLY_FIELDS contains an entry for it — no fields registered as alterable on the fly for this sink.","triggerScenarios":"Calling check_sink_allow_alter_on_fly_fields with a valid sink name lacking a generated allow-list entry (generator not run, stale generated code, or sink intentionally has none).","commonSituations":"Newly added sink without regenerated maps; cached build missing updated generated code; calling the check for a sink that does not support on-the-fly field alterations.","solutions":["Re-run the code generation that builds SINK_ALLOW_ALTER_ON_FLY_FIELDS.","Add allow_alter_on_fly fields to the sink definition and regenerate if it should support them.","Bypass this validation for sinks with no registered fields."],"exampleFix":"// before\ncheck_sink_allow_alter_on_fly_fields(sink, fields)?;\n// after\nmatch sink_allow_alter_fields(sink) {\n    Some(_) => check_sink_allow_alter_on_fly_fields(sink, fields)?,\n    None => {} // sink does not support on-the-fly alterations\n}","handlingStrategy":"type-guard","validationCode":"fn sink_has_alter_fields(name: &str) -> bool {\n    if name == JdbcSink::SINK_NAME {\n        return CONNECTION_ALLOW_ALTER_ON_FLY_FIELDS.get(JdbcSink::SINK_NAME).is_some();\n    }\n    sink_properties::sink_name_to_config_type_name(name)\n        .and_then(|t| SINK_ALLOW_ALTER_ON_FLY_FIELDS.get(t))\n        .is_some()\n}","typeGuard":null,"tryCatchPattern":"if sink_has_alter_fields(sink) {\n    check_sink_allow_alter_on_fly_fields(sink, fields)?;\n}","preventionTips":["Re-run generation after adding sinks","Add a test that every registered sink has an allow-list entry or is explicitly exempt"],"tags":["sink","registry","generated-code"],"backgroundTag":"missing-required-config-field","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"}