{"record":{"id":"b44ab619ad0ed60c","repo":"risingwavelabs/risingwave","slug":"http-sink-with-multiple-columns-requires-a-payload","errorCode":null,"errorMessage":"HTTP sink with multiple columns requires a payload column","messagePattern":"HTTP sink with multiple columns requires a payload column","errorType":"validation","errorClass":"SinkError::Config","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/http.rs","lineNumber":153,"sourceCode":"        (0, HttpUrl::Static(url), fields[0].data_type.clone())\n    } else {\n        for field in fields {\n            match field.name.as_str() {\n                HTTP_SINK_PAYLOAD_COLUMN | HTTP_SINK_URL_COLUMN => {}\n                _ => {\n                    return Err(SinkError::Config(anyhow!(\n                        \"HTTP sink with multiple columns only supports payload and url columns, got {}\",\n                        field.name\n                    )));\n                }\n            }\n        }\n\n        let payload_index = fields\n            .iter()\n            .position(|field| field.name == HTTP_SINK_PAYLOAD_COLUMN)\n            .ok_or_else(|| {\n                SinkError::Config(anyhow!(\n                    \"HTTP sink with multiple columns requires a payload column\"\n                ))\n            })?;\n        let url_index = fields\n            .iter()\n            .position(|field| field.name == HTTP_SINK_URL_COLUMN);\n        let url = match (url, url_index) {\n            (Some(_), Some(_)) => {\n                return Err(SinkError::Config(anyhow!(\n                    \"HTTP sink url option cannot coexist with url column\"\n                )));\n            }\n            (Some(url), None) => {\n                let url = url\n                    .parse()\n                    .context(\"invalid URL\")\n                    .map_err(SinkError::Config)?;\n                HttpUrl::Static(url)","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/http.rs#L135-L171","documentation":"Schema validation in validate_http_sink for multi-column HTTP sinks: after confirming all columns are `payload` or `url`, a column actually named `payload` must exist to carry the request body. It fires when a multi-column schema has only a `url` column (or none of the allowed names' payload counterpart), leaving the HTTP request body undefined.","triggerScenarios":"`validate_http_sink` finds fields.iter().position(payload column) == None for a multi-column schema.","commonSituations":"User defines only a url column expecting GET-like behavior; payload column misspelled; schema projection dropped the payload column.","solutions":["Add/rename a column to the expected payload column name","Ensure your MV projects both payload (and optionally url) columns","Check exact column-name spelling per HTTP sink docs"],"exampleFix":"// before\nCREATE MATERIALIZED VIEW mv AS SELECT target_url FROM src;\n// after\nCREATE MATERIALIZED VIEW mv AS SELECT payload, target_url FROM src;","handlingStrategy":"validation","validationCode":"// ensure the payload column exists in multi-column schemas\nlet names: Vec<&str> = schema.fields().iter().map(|f| f.name.as_str()).collect();\nif names.len() > 1 && !names.contains(&\"payload\") {\n    return Err(\"multi-column HTTP sink schema requires a payload column\".into());\n}","typeGuard":null,"tryCatchPattern":"match sink::try_create(props) {\n    Err(e) if e.to_string().contains(\"requires a payload column\") => {\n        log::error!(\"add the payload column to the MV: {e}\");\n    }\n    r => r?,\n}","preventionTips":["Include the payload column in every HTTP sink projection","Spell column names exactly per the sink constants","Review MV definitions alongside sink WITH clauses during code review"],"tags":["http","sink","payload","schema","validation"],"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-14T16:17:12.679Z"}