{"record":{"id":"963bf2fb9304b434","repo":"dbt-labs/dbt-core","slug":"group-by-with-non-string-key-type","errorCode":null,"errorMessage":"group_by with non-string key_type","messagePattern":"group_by with non-string key_type","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/dbt-agate/src/table.rs","lineNumber":1193,"sourceCode":"                iter.finish()?;\n\n                let key = match key.as_str() {\n                    Some(s) => s,\n                    None => unimplemented!(\"group_by with function key\"),\n                };\n                let key_name = match key_name {\n                    Some(v) => match v.as_str() {\n                        Some(s) => s,\n                        None => unimplemented!(\"group_by with non-string key_name\"),\n                    },\n                    None => \"group\",\n                };\n                let key_type = match key_type {\n                    Some(ty) => match ty.downcast_object_ref::<crate::DataType>() {\n                        Some(dt) => Some(dt.clone()),\n                        None => {\n                            // TODO: support DataType class instances\n                            unimplemented!(\"group_by with non-string key_type\")\n                        }\n                    },\n                    None => None,\n                };\n                let table_set = self\n                    .as_ref()\n                    .group_by_key(key, key_name, key_type)\n                    .map_err(|e| {\n                        Error::new(ErrorKind::InvalidOperation, format!(\"Table.group_by: {e}\"))\n                    })?;\n                Ok(Value::from_object(table_set))\n            }\n            // ```python\n            // def join(self, right_table, left_key=None, right_key=None, inner=False,\n            //         full_outer=False, require_match=False, columns=None):\n            //     \"\"\"\n            //     Create a new table by joining two table's on common values. This method\n            //     implements most varieties of SQL join, in addition to some unique features.","sourceCodeStart":1175,"sourceCodeEnd":1211,"githubUrl":"https://github.com/dbt-labs/dbt-core/blob/0267ce9170576975b76b64ce856b2e5848e96617/crates/dbt-agate/src/table.rs#L1175-L1211","documentation":"dbt-agate's Rust Table group_by only accepts a key_type given as a crate::DataType object reference; any other value (e.g. a raw type name string or a foreign class instance) hits unimplemented!(). Supporting arbitrary DataType class instances is a known TODO in the source.","triggerScenarios":"Calling table.group_by(...) with key_type set to something that does not downcast to crate::DataType, such as a Python-style type object or a string like \"Number\".","commonSituations":"Porting Python agate calls like group_by(key, key_type=agate.Number) where the type is passed as a class reference; passing dtype names as strings from config-driven pipelines.","solutions":["Construct a crate::DataType instance and pass that as key_type","Omit key_type so it defaults to None","Convert the desired type into crate::DataType before calling group_by"],"exampleFix":"// before\nlet key_type = Value::from(\"Number\");\ntable.call_method(\"group_by\", kwargs!{\"key_type\" => key_type})\n// after\nlet key_type = Value::from_object(crate::DataType::number());\ntable.call_method(\"group_by\", kwargs!{\"key_type\" => key_type})","handlingStrategy":"type-guard","validationCode":"let key_type_ok = key_type.as_ref().and_then(|v| v.downcast_object_ref::<crate::DataType>()).is_some();","typeGuard":"fn is_data_type(v: &Value) -> bool { v.downcast_object_ref::<crate::DataType>().is_some() }","tryCatchPattern":null,"preventionTips":["Only pass crate::DataType instances as key_type","Omit key_type when the default is acceptable","Track upstream TODO for DataType class instance support"],"tags":["unimplemented","group-by","type-mismatch","rust"],"backgroundTag":"unsupported-operation","analyzedSha":"0267ce9170576975b76b64ce856b2e5848e96617","analyzedAt":"2026-09-07T21:53:39.732Z","contentChangedAt":"2026-09-07T21:53:39.732Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}