{"record":{"id":"1e7f1772c253157b","repo":"risingwavelabs/risingwave","slug":"turbopuffer-namespace-column-must-be-varchar-got","errorCode":null,"errorMessage":"Turbopuffer namespace_column must be varchar, got {:?}","messagePattern":"Turbopuffer namespace_column must be varchar, got (.+?)","errorType":"validation","errorClass":"SinkError::Config","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/turbopuffer.rs","lineNumber":191,"sourceCode":"\n        let namespace = match (&config.namespace, &config.namespace_column) {\n            (Some(namespace), None) => {\n                validate_namespace(namespace)?;\n                TurbopufferNamespace::Static(namespace.clone())\n            }\n            (None, Some(namespace_column)) => {\n                let index = schema\n                    .fields()\n                    .iter()\n                    .position(|field| field.name == *namespace_column)\n                    .ok_or_else(|| {\n                        SinkError::Config(anyhow!(\n                            \"Turbopuffer namespace_column '{}' not found in sink schema\",\n                            namespace_column\n                        ))\n                    })?;\n                if schema[index].data_type != DataType::Varchar {\n                    return Err(SinkError::Config(anyhow!(\n                        \"Turbopuffer namespace_column must be varchar, got {:?}\",\n                        schema[index].data_type\n                    )));\n                }\n                TurbopufferNamespace::Dynamic { index }\n            }\n            (Some(_), Some(_)) => {\n                return Err(SinkError::Config(anyhow!(\n                    \"Turbopuffer sink requires only one of namespace or namespace_column\"\n                )));\n            }\n            (None, None) => {\n                return Err(SinkError::Config(anyhow!(\n                    \"Turbopuffer sink requires either namespace or namespace_column\"\n                )));\n            }\n        };\n","sourceCodeStart":173,"sourceCodeEnd":209,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/turbopuffer.rs#L173-L209","documentation":"The Turbopuffer sink requires the column designated as `namespace_column` to hold varchar values, because namespaces are string identifiers used in the namespace URL. During sink creation (`try_from`), the sink schema is checked and this error is thrown if the column's data type is anything other than VARCHAR. This is a fail-fast config validation so bad types never reach the writer.","triggerScenarios":"Creating a Turbopuffer sink with `with ('namespace_column' = '<col>')` where `<col>` exists in the sink schema but its declared type is INT, BOOLEAN, VECTOR, etc. rather than VARCHAR.","commonSituations":"Users point namespace_column at a numeric partition or tenant-id column assuming any column works; type changes via schema evolution make a formerly-varchar column numeric; copy-pasting sink definitions from tables with different column types.","solutions":["Cast the column to VARCHAR upstream (e.g. in the MV feeding the sink) or declare it VARCHAR in the sink schema.","Choose a different column that is already VARCHAR for namespace_column.","Compute a varchar namespace column via a generated expression, e.g. `tenant_id::varchar AS namespace` in the source materialization.","If the namespace is fixed, drop namespace_column and use the literal `namespace` option instead."],"exampleFix":"// before\nCREATE SINK s FROM mv WITH (\n  connector = 'turbopuffer',\n  namespace_column = 'tenant_id'  -- tenant_id is INT\n);\n\n// after\nCREATE MATERIALIZED VIEW mv2 AS\nSELECT tenant_id::varchar AS tenant_namespace, * FROM mv;\nCREATE SINK s FROM mv2 WITH (\n  connector = 'turbopuffer',\n  namespace_column = 'tenant_namespace'\n);","handlingStrategy":"validation","validationCode":"// SQL: verify the namespace column type before creating the sink\nSELECT data_type FROM rw_columns WHERE relation = 'mv_for_sink' AND name = 'ns';\n// require: data_type == 'VARCHAR'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep namespace columns VARCHAR by convention, casting numeric tenant ids at the MV layer","Check rw_columns for the column type before sink creation","Prefer a static `namespace` option when per-row namespaces are not needed"],"tags":["sink","turbopuffer","config","type-mismatch"],"backgroundTag":"type-mismatch","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"}