{"record":{"id":"4283a200c751a8c5","repo":"dbt-labs/dbt-core","slug":"agate-table-must-be-an-agate-table","errorCode":null,"errorMessage":"agate_table must be an agate.Table","messagePattern":"agate_table must be an agate\\.Table","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/dbt-adapter/src/adapter/mod.rs","lineNumber":3757,"sourceCode":"                        \"database\",\n                        \"schema\",\n                        \"table_name\",\n                        \"file_path\",\n                        \"agate_table\",\n                        \"column_overrides\",\n                        \"field_delimiter\",\n                    ],\n                    args,\n                );\n                let database = iter.next_arg::<&str>()?;\n                let schema = iter.next_arg::<&str>()?;\n                let table_name = iter.next_arg::<&str>()?;\n                let file_path = iter.next_arg::<&str>()?;\n                let agate_table = iter\n                    .next_arg::<&Value>()?\n                    .downcast_object::<AgateTable>()\n                    .ok_or_else(|| {\n                        minijinja::Error::new(\n                            minijinja::ErrorKind::InvalidOperation,\n                            \"agate_table must be an agate.Table\",\n                        )\n                    })?;\n                let column_overrides_val = iter.next_arg::<Value>()?;\n                let column_overrides = minijinja_value_to_typed_struct::<IndexMap<String, String>>(\n                    column_overrides_val,\n                )\n                .map_err(|e| {\n                    minijinja::Error::new(\n                        minijinja::ErrorKind::SerdeDeserializeError,\n                        e.to_string(),\n                    )\n                })?;\n                let field_delimiter = iter.next_arg::<&str>()?;\n                iter.finish()?;\n\n                if let adapter_impl::InnerAdapter::Replay(_, replay) = adapter.inner_adapter() {","sourceCodeStart":3739,"sourceCodeEnd":3775,"githubUrl":"https://github.com/dbt-labs/dbt-core/blob/0267ce9170576975b76b64ce856b2e5848e96617/crates/dbt-adapter/src/adapter/mod.rs#L3739-L3775","documentation":"An InvalidOperation minijinja error thrown when the `agate_table` argument to the load-file/index-creation callable cannot be downcast to an AgateTable object. The callable requires the actual agate Table wrapper; any other Value (dict, string, None) fails the downcast.","triggerScenarios":"Calling the function (table_name, file_path, agate_table, ...) with agate_table set to a raw dict, a JSON string, None, or an object not wrapped as an AgateTable minijinja Value.","commonSituations":"Custom seed/index macros that build tables as plain dicts; passing `None` when the seed has no rows; Python objects that crossed the bridge without agate wrapping; dbt version differences in how agate tables are exposed to Jinja.","solutions":["Pass the real `agate_table` object provided by the seed/load context (an actual agate.Table exposed to Jinja).","Ensure your code path actually creates an agate.Table instead of a dict/list before calling.","If the table may be absent, guard and skip the call rather than passing None.","Verify the binding/wrapper layer converts agate tables into AgateTable Values."],"exampleFix":"// before\ncreate_indexes('t', 'path.csv', {'col': 'int'})\n// after\ncreate_indexes('t', 'path.csv', agate_table)","handlingStrategy":"type-guard","validationCode":"{% if agate_table is defined and agate_table is not string and agate_table is not mapping %}\n  {# likely a real agate table #}\n{% endif %}","typeGuard":"fn is_agate_table(v: &Value) -> bool {\n    v.downcast_object::<AgateTable>().is_some()\n}","tryCatchPattern":"match val.downcast_object::<AgateTable>() { Some(t) => ..., None => Err(invalid_operation(\"agate_table must be an agate.Table\")) }","preventionTips":["Pass the context-provided agate table object from load_result/seed flows","Ensure bridge code wraps Python agate.Table values as AgateTable","Handle empty seeds by skipping the call instead of passing None"],"tags":["jinja","argument-type","agate"],"backgroundTag":"invalid-argument-value","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"}