{"record":{"id":"a40cff36e0cdbcbc","repo":"risingwavelabs/risingwave","slug":"invalid-value-for-is-exactly-once-expected-tru-a40cff","errorCode":null,"errorMessage":"invalid value for `is_exactly_once`: expected `true` or `false`, got `{value}`","messagePattern":"invalid value for `is_exactly_once`: expected `true` or `false`, got `(.+?)`","errorType":"validation","errorClass":"SinkError::Config","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/iceberg/mod.rs","lineNumber":221,"sourceCode":"            param,\n            upsert_primary_key_column_names,\n        })\n    }\n}\n\nimpl Sink for IcebergSink {\n    type LogSinker = CoordinatedLogSinker<IcebergSinkWriter>;\n\n    const SINK_NAME: &'static str = ICEBERG_SINK;\n\n    crate::impl_validate_sink_unknown_fields!();\n\n    fn is_exactly_once(properties: &BTreeMap<String, String>) -> Result<bool> {\n        let Some(value) = properties.get(\"is_exactly_once\") else {\n            return Ok(true);\n        };\n        value.parse::<bool>().map_err(|_| {\n            SinkError::Config(anyhow!(\n                \"invalid value for `is_exactly_once`: expected `true` or `false`, got `{value}`\"\n            ))\n        })\n    }\n\n    async fn validate(&self) -> Result<()> {\n        let catalog_kind = self.config.catalog_kind()?;\n        if matches!(catalog_kind, IcebergCatalogKind::Snowflake) {\n            bail!(\"Snowflake catalog only supports iceberg sources\");\n        }\n\n        if matches!(catalog_kind, IcebergCatalogKind::Glue(_)) {\n            risingwave_common::license::Feature::IcebergSinkWithGlue\n                .check_available()\n                .map_err(|e| anyhow::anyhow!(e))?;\n        }\n\n        // Enforce merge-on-read for append-only tables","sourceCodeStart":203,"sourceCodeEnd":239,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/iceberg/mod.rs#L203-L239","documentation":"The Iceberg sink's `is_exactly_once` helper parses the optional `is_exactly_once` sink property as a Rust bool. If the property is absent it defaults to true, but if present it must be exactly `true` or `false` (Rust bool parsing); any other string makes the sink construction fail with this config error.","triggerScenarios":"Creating or altering an Iceberg sink with a property like `is_exactly_once = 'True'`, `'1'`, `'yes'`, or `' true'` (whitespace or capitalized). Rust's `str::parse::<bool>()` only accepts lowercase `true`/`false`.","commonSituations":"Users porting configs from systems that accept `True`/`1`/`yes`, templated SQL that interpolates an untyped value, or hand-edited sink DDL with typos.","solutions":["Set the property to exactly `true` or `false` in lowercase, e.g. `'is_exactly_once'='true'`.","Remove the property entirely if you want the default behavior (defaults to true).","Check the ALTER SINK / CREATE SINK statement for stray quotes, whitespace, or templating artifacts around the value."],"exampleFix":"-- before\nCREATE SINK s FROM mv WITH (connector='iceberg', 'is_exactly_once'='True');\n-- after\nCREATE SINK s FROM mv WITH (connector='iceberg', 'is_exactly_once'='true');","handlingStrategy":"validation","validationCode":"fn valid_bool_prop(props: &std::collections::BTreeMap<String, String>) -> Result<(), String> {\n    if let Some(v) = props.get(\"is_exactly_once\") {\n        if v != \"true\" && v != \"false\" {\n            return Err(format!(\"is_exactly_once must be 'true' or 'false', got {v:?}\"));\n        }\n    }\n    Ok(())\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always write boolean sink properties in lowercase: 'true'/'false'.","Omit the property when you want the default instead of guessing a disable value.","Test CREATE SINK DDL against a dev cluster before running in production."],"tags":["iceberg","sink","config","boolean-parsing"],"backgroundTag":"invalid-flag-value","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"}