{"record":{"id":"906bdf8c43dc73f9","repo":"dbt-labs/dbt-core","slug":"doc-takes-one-or-two-positional-string-arguments","errorCode":null,"errorMessage":"doc() takes one or two positional string arguments","messagePattern":"doc\\(\\) takes one or two positional string arguments","errorType":"validation","errorClass":"InvalidOperation","httpStatus":null,"severity":"error","filePath":"crates/dbt-jinja-utils/src/functions/base.rs","lineNumber":232,"sourceCode":"                .first()\n                .map(|(_, idx)| self.docs_content[*idx].as_str())\n        })\n    }\n}\n\nimpl Object for DocMacro {\n    /// Implements the call method on the var object\n    fn call(\n        self: &Arc<Self>,\n        state: &State<'_, '_>,\n        args: &[Value],\n        _listeners: &[Rc<dyn RenderingEventListener>],\n    ) -> Result<Value, Error> {\n        let mut args = ArgParser::new(args, None);\n        // Core's `doc(self, *args: str)`. Lenient mode keeps the historical tolerance,\n        // because model/source/column descriptions still render through it.\n        if self.strict && (args.kwargs_len() != 0 || !(1..=2).contains(&args.positional_len())) {\n            return Err(Error::new(\n                ErrorKind::InvalidOperation,\n                \"doc() takes one or two positional string arguments\",\n            ));\n        }\n        let (arg1, arg2) = if self.strict {\n            // Both args are annotated `str`, so no coercion either.\n            let package_or_name = args.get::<Arc<str>>(\"\")?.to_string();\n            let name = if args.positional_len() == 0 {\n                None\n            } else {\n                Some(args.get::<Arc<str>>(\"\")?.to_string())\n            };\n            (package_or_name, name)\n        } else {\n            let arg1 = args.get::<String>(\"\").map_err(|_| {\n                Error::new(\n                    ErrorKind::InvalidOperation,\n                    \"Invalid arguments to doc macro\",","sourceCodeStart":214,"sourceCodeEnd":250,"githubUrl":"https://github.com/dbt-labs/dbt-core/blob/0267ce9170576975b76b64ce856b2e5848e96617/crates/dbt-jinja-utils/src/functions/base.rs#L214-L250","documentation":"In strict mode, the Jinja doc() function accepts exactly one or two positional string arguments and no keyword arguments, mirroring dbt-core's doc(self, *args). When the argument count or kwargs violate this signature, this InvalidOperation error is raised at parse time of the call.","triggerScenarios":"Invoking {{ doc(...) }} with zero, three or more positional arguments, or with any keyword arguments, while strict mode is enabled.","commonSituations":"Typo like {{ doc('a', 'b', 'c') }}, accidentally passing kwargs ({{ doc(name='x') }}), or a macro-generated call with extra args after migrating to strict rendering.","solutions":["Call doc() with exactly one argument: {{ doc('column_name') }}.","Use two arguments only for package-qualified docs: {{ doc('package_name', 'doc_name') }}.","Remove any keyword arguments from the doc() call.","If legacy templates need lenient behavior, run with strict mode disabled."],"exampleFix":"// before\n{{ doc('orders', 'order_id', extra) }}\n// after\n{{ doc('orders', 'order_id') }}","handlingStrategy":"validation","validationCode":"{% if var_args | length > 2 %}{% do exceptions.raise_compiler_error('doc() takes at most 2 args') %}{% endif %}","typeGuard":null,"tryCatchPattern":"{% set result = doc(name, package) %}","preventionTips":["Use {{ doc('name') }} or {{ doc('package', 'name') }} forms only.","Never pass keyword arguments to doc().","Lint templates for doc( calls with more than one comma."],"tags":["jinja","doc","arguments","strict-mode"],"backgroundTag":"missing-required-argument","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"}