{"record":{"id":"c5c9cda1dbd11764","repo":"dbt-labs/dbt-core","slug":"in-adapter-dispatch-got-a-macro-name-of-macro-n","errorCode":null,"errorMessage":"In adapter.dispatch, got a macro name of \"{macro_name}\", but \".\" is not a valid macro name component. Did you mean `adapter.dispatch(\"{parts[1]}\", macro_namespace=\"{parts[0]}\")`?","messagePattern":"In adapter\\.dispatch, got a macro name of \"(.+?)\", but \"\\.\" is not a valid macro name component\\. Did you mean `adapter\\.dispatch\\(\"(.+?)\", macro_namespace=\"(.+?)\"\\)`\\?","errorType":"exception","errorClass":"minijinja::Error::InvalidOperation","httpStatus":null,"severity":"error","filePath":"crates/dbt-adapter/src/adapter/mod.rs","lineNumber":1852,"sourceCode":"    ///\n    /// https://github.com/dbt-labs/dbt-adapters/blob/main/dbt-adapters/src/dbt/adapters/base/impl.py#L226\n    ///\n    /// ```python\n    /// def dispatch(\n    ///     self,\n    ///     macro_name: str,\n    ///     macro_namespace: Optional[str] = None\n    /// ) -> DispatchObject\n    /// ```\n    pub fn dispatch(&self, state: &State, args: &[Value]) -> Result<Value, minijinja::Error> {\n        let iter = ArgsIter::new(\"dispatch\", &[\"macro_name\"], args);\n        let macro_name = iter.next_arg::<&str>()?;\n        let macro_namespace = iter.next_kwarg::<Option<&str>>(\"macro_namespace\")?;\n        iter.finish()?;\n\n        if macro_name.contains('.') {\n            let parts: Vec<&str> = macro_name.split('.').collect();\n            return Err(minijinja::Error::new(\n                minijinja::ErrorKind::InvalidOperation,\n                format!(\n                    \"In adapter.dispatch, got a macro name of \\\"{}\\\", but \\\".\\\" is not a valid macro name component. Did you mean `adapter.dispatch(\\\"{}\\\", macro_namespace=\\\"{}\\\")`?\",\n                    macro_name, parts[1], parts[0]\n                ),\n            ));\n        }\n\n        Ok(Value::from_object(DispatchObject {\n            macro_name: macro_name.to_string(),\n            package_name: macro_namespace.map(|s| s.to_string()),\n            strict: false,\n            auto_execute: false,\n            context: Some(state.get_base_context()),\n        }))\n    }\n\n    /// Nest column data types for BigQuery STRUCT/ARRAY types.","sourceCodeStart":1834,"sourceCodeEnd":1870,"githubUrl":"https://github.com/dbt-labs/dbt-core/blob/0267ce9170576975b76b64ce856b2e5848e96617/crates/dbt-adapter/src/adapter/mod.rs#L1834-L1870","documentation":"`adapter.dispatch` resolves macros at runtime, and macro names may not contain a dot. When a name like `package.macro_name` is passed, the library raises `InvalidOperation` and suggests the correct form: pass the bare macro name positionally and the package via the `macro_namespace` keyword argument. This mirrors upstream dbt's dispatch validation.","triggerScenarios":"Calling `adapter.dispatch('my_package.my_macro')` or `adapter.dispatch('namespace.macro', ...)` from Jinja — any macro name containing `.`.","commonSituations":"Copy-pasted `{{ package }}__macro` conventions from Python dbt; users converting `ref()`-style qualified names to dispatch; older macros written before `macro_namespace` was introduced.","solutions":["Split the qualified name: pass the part after the dot as the first argument.","Pass the part before the dot as `macro_namespace='...'`.","Search the project for `adapter.dispatch(` calls containing a `.` and fix them all.","If the dot was accidental, remove it so the name is a bare macro name."],"exampleFix":"// before (Jinja)\n{% set my_macro = adapter.dispatch('my_package.my_macro') %}\n// after\n{% set my_macro = adapter.dispatch('my_macro', macro_namespace='my_package') %}","handlingStrategy":"validation","validationCode":"{# Jinja #}\n{% if '.' in macro_name %}\n  {% set parts = macro_name.split('.') %}\n  {% set macro_name, ns = parts[1], parts[0] %}\n{% endif %}\n{% do adapter.dispatch(macro_name, macro_namespace=ns) %}","typeGuard":"function isValidMacroName(name) { return typeof name === 'string' && !name.includes('.'); }","tryCatchPattern":"{% try %}\n  {% set fn = adapter.dispatch(macro_name) %}\n{% except %}\n  {{ log('dispatch failed for ' ~ macro_name ~ ': split on . and use macro_namespace', info=true) }}\n{% endtry %}","preventionTips":["Never pass dotted names to adapter.dispatch","Lint macros for `adapter.dispatch(` calls containing a dot","Use macro_namespace for package-qualified dispatch"],"tags":["jinja","adapter","dispatch","macro","argument"],"backgroundTag":"invalid-argument-format","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"}