{"record":{"id":"19706960a85d5ee6","repo":"risingwavelabs/risingwave","slug":"http-sink-with-multiple-columns-only-supports-payl","errorCode":null,"errorMessage":"HTTP sink with multiple columns only supports payload and url columns, got {}","messagePattern":"HTTP sink with multiple columns only supports payload and url columns, got (.+?)","errorType":"validation","errorClass":"SinkError::Config","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/http.rs","lineNumber":141,"sourceCode":"\n    let fields = schema.fields();\n    let (payload_index, url, payload_type) = if fields.len() == 1 {\n        let Some(url) = url else {\n            return Err(SinkError::Config(anyhow!(\n                \"HTTP sink requires url option when schema has exactly 1 column\"\n            )));\n        };\n        let url = url\n            .parse()\n            .context(\"invalid URL\")\n            .map_err(SinkError::Config)?;\n        (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);","sourceCodeStart":123,"sourceCodeEnd":159,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/http.rs#L123-L159","documentation":"Schema validation in validate_http_sink: when the sink schema has more than one column, every column must be named `payload` or `url`; any other column name triggers this error. It names the offending column so the user can rename or drop it.","triggerScenarios":"`validate_http_sink` iterates multi-column fields and finds a name that is neither HTTP_SINK_PAYLOAD_COLUMN nor HTTP_SINK_URL_COLUMN.","commonSituations":"User tries to send extra metadata columns alongside the payload; schema of the MV inherited extra columns from SELECT *; renamed payload/url columns.","solutions":["Restrict the MV to only payload and url columns (project explicitly in SELECT)","Rename your columns to the expected payload/url column names","Collapse extra data into the payload column (e.g. JSON-encode it)"],"exampleFix":"// before\nCREATE MATERIALIZED VIEW mv AS SELECT payload, url, extra_meta FROM src;\n// after\nCREATE MATERIALIZED VIEW mv AS SELECT payload, url FROM src;","handlingStrategy":"validation","validationCode":"// verify only allowed columns exist for multi-column schemas\nlet allowed: Vec<&str> = vec![\"payload\", \"url\"]; // per HTTP_SINK_* constants\nlet names: Vec<&str> = schema.fields().iter().map(|f| f.name.as_str()).collect();\nif names.len() > 1 && names.iter().any(|n| !allowed.contains(n)) {\n    return Err(format!(\"unsupported columns: only payload/url allowed, got {names:?}\"));\n}","typeGuard":null,"tryCatchPattern":"match sink::try_create(props) {\n    Err(e) if e.to_string().contains(\"payload and url columns\") => {\n        log::error!(\"project the MV down to payload/url columns: {e}\");\n    }\n    r => r?,\n}","preventionTips":["Avoid SELECT * when defining HTTP sink MVs","Encode extra metadata into the payload column","Follow the documented payload/url column naming"],"tags":["http","sink","schema","columns","validation"],"backgroundTag":"schema-validation-failed","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"}