{"record":{"id":"9beee89e75213b90","repo":"databendlabs/databend","slug":"unsupported-column-type-for-length-calculation","errorCode":null,"errorMessage":"Unsupported column type for length calculation","messagePattern":"Unsupported column type for length calculation","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/query/pipeline/transforms/src/processors/transforms/sorts/core/row_convert/variable.rs","lineNumber":482,"sourceCode":"        self.visit_variable_length_data(column.iter(), encoded_len)\n    }\n\n    fn visit_string(&mut self, column: StringColumn) -> Result<()> {\n        self.visit_variable_length_data(column.iter(), |s, is_null| {\n            encoded_len(s.as_bytes(), is_null)\n        })\n    }\n\n    fn visit_variant(&mut self, column: BinaryColumn) -> Result<()> {\n        self.visit_variable_length_data(column.iter(), encoded_len)\n    }\n\n    fn visit_typed_column<T: ValueType>(\n        &mut self,\n        _column: T::Column,\n        _data_type: &DataType,\n    ) -> Result<()> {\n        unimplemented!(\"Unsupported column type for length calculation\")\n    }\n}\n\nstruct EncodeVisitor<'a> {\n    out: &'a mut BinaryColumnBuilder,\n    validity: (bool, Option<&'a Bitmap>),\n    field: &'a RowSortField,\n}\n\nimpl EncodeVisitor<'_> {\n    fn visit_const_column(&mut self, scalar: &Scalar, data_type: &DataType) -> Result<()> {\n        let is_null = scalar.is_null();\n        debug_assert!(data_type.is_nullable_or_null() || !is_null);\n        match data_type.remove_nullable() {\n            DataType::Null => {}\n            DataType::Boolean => {\n                let scalar = if is_null {\n                    false","sourceCodeStart":464,"sourceCodeEnd":500,"githubUrl":"https://github.com/databendlabs/databend/blob/288d84d76e20a2f8f7173bda9691eb6ece301aa9/src/query/pipeline/transforms/src/processors/transforms/sorts/core/row_convert/variable.rs#L464-L500","documentation":"The variable-size row encoder's length-calculation visitor computes encoded lengths before writing sort rows. Its default visit_typed_column arm raises unimplemented!(\"Unsupported column type for length calculation\") for types it cannot measure. Sorting on such a column with the variable encoder is unsupported.","triggerScenarios":"A sort/ORDER BY (or window partition key) includes a column type whose encoded length cannot be computed by the variable encoder — types not routed to a proper visitor arm.","commonSituations":"ORDER BY on newly added or nested types (arrays, maps, variants) that only partially support variable encoding; optimizer selecting variable encoding for an unsupported type; version skew between data type support and sorter support.","solutions":["Cast the sort key to a supported type before ordering (e.g. col::string)","Restructure the query to sort by a primitive column or expression","Check the Databend release notes for sort-encoder support of the type; upgrade if added","Implement the missing length-measurement arm in the variable encoder if you maintain the code"],"exampleFix":"// before\nSELECT * FROM t ORDER BY map_col;\n// after\nSELECT * FROM t ORDER BY map_col['key']::string;","handlingStrategy":"validation","validationCode":"-- sql: keep variable-width sort keys to supported types (String primarily)\nSELECT data_type FROM information_schema.columns\nWHERE table_name = 't' AND column_name IN ('sort_col');\n-- cast non-string variable keys: ORDER BY sort_col::string","typeGuard":"fn variable_encodable(ty: &DataType) -> bool {\n    matches!(ty, DataType::String | DataType::Nullable(box inner)\n        if matches!(**inner, DataType::String))\n        || matches!(ty, DataType::String)\n}","tryCatchPattern":null,"preventionTips":["Cast complex sort keys to VARCHAR/numeric before ordering","Prefer sorting on primitive columns in hot paths","Verify sorter support for a type before adding it to window partition/order keys"],"tags":["rust","panic","sort","row-encoding","unsupported-type"],"backgroundTag":"method-not-implemented","analyzedSha":"288d84d76e20a2f8f7173bda9691eb6ece301aa9","analyzedAt":"2026-09-11T11:29:36.208Z","contentChangedAt":"2026-09-11T11:29:36.208Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}