{"record":{"id":"ce13aadd4508eac8","repo":"dbt-labs/dbt-core","slug":"adapter-add-time-ingestion-partition-column-failed","errorCode":null,"errorMessage":"adapter.add_time_ingestion_partition_column failed on partition_by {partition_by:?}: {e}","messagePattern":"adapter\\.add_time_ingestion_partition_column failed on partition_by (.+?): (.+?)","errorType":"exception","errorClass":"minijinja::Error::SerdeDeserializeError","httpStatus":null,"severity":"error","filePath":"crates/dbt-adapter/src/adapter/mod.rs","lineNumber":2243,"sourceCode":"        _state: &State,\n        args: &[Value],\n    ) -> Result<Value, minijinja::Error> {\n        match &self.inner {\n            Typed { adapter, .. } => {\n                let iter = ArgsIter::new(\n                    \"add_time_ingestion_partition_column\",\n                    &[\"partition_by\", \"columns\"],\n                    args,\n                );\n                let partition_by = iter.next_arg::<&Value>()?;\n                let columns = iter.next_arg::<&Value>()?;\n                iter.finish()?;\n\n                // Match original behavior: try to deserialize directly, let deserialization handle errors\n                let partition_by =\n                    minijinja_value_to_typed_struct::<PartitionConfig>(partition_by.clone())\n                        .map_err(|e| {\n                            minijinja::Error::new(\n                                minijinja::ErrorKind::SerdeDeserializeError,\n                                format!(\n                                    \"adapter.add_time_ingestion_partition_column failed on partition_by {partition_by:?}: {e}\"\n                                ),\n                            )\n                        })?;\n\n                let partition_config = partition_by.into_bigquery().ok_or_else(|| {\n                    minijinja::Error::new(\n                        minijinja::ErrorKind::InvalidArgument,\n                        \"Expect a BigqueryPartitionConfigStruct\",\n                    )\n                })?;\n\n                let result = adapter\n                    .add_time_ingestion_partition_column(columns.clone(), partition_config)?;\n                Ok(result)\n            }","sourceCodeStart":2225,"sourceCodeEnd":2261,"githubUrl":"https://github.com/dbt-labs/dbt-core/blob/0267ce9170576975b76b64ce856b2e5848e96617/crates/dbt-adapter/src/adapter/mod.rs#L2225-L2261","documentation":"add_time_ingestion_partition_column() (a BigQuery-specific adapter macro) deserializes its `partition_by` argument into a PartitionConfig struct before building the time-ingestion partition column. If the value cannot be converted — e.g. it is not a dict with a recognized `granularity`/`type` combination, or field types are wrong — this SerdeDeserializeError is raised echoing the offending value and serde detail. The message deliberately includes the partition_by value to aid debugging.","triggerScenarios":"Calling adapter.add_time_ingestion_partition_column(partition_by, columns) from Jinja where partition_by is a string like 'DATE', a dict with unsupported keys, an invalid granularity value, or a non-object value instead of a parsed PartitionConfig produced by parse_partition_by.","commonSituations":"BigQuery time-ingestion partitioning setups where users hand-write partition_by instead of passing the output of adapter.parse_partition_by(config.model.partition_by); typos in granularity (e.g. 'day' vs 'DAY'); config passed through string interpolation losing its dict shape.","solutions":["Read the serde detail and the echoed partition_by value to see what shape was actually received.","Pass the result of adapter.parse_partition_by(raw_partition_by) as partition_by rather than a raw string or hand-built dict.","Fix the partition_by config in the model so it deserializes into PartitionConfig (valid type/granularity fields with correct types).","Ensure the value is a dict/object when it reaches the macro — avoid stringifying config values in macros."],"exampleFix":"// before\n{% do adapter.add_time_ingestion_partition_column(config.model.partition_by, columns) %}\n\n// after\n{% set partition_by = adapter.parse_partition_by(config.model.partition_by) %}\n{% do adapter.add_time_ingestion_partition_column(partition_by, columns) %}","handlingStrategy":"validation","validationCode":"{% set partition_by = adapter.parse_partition_by(config.model.partition_by) %}\n{% if partition_by is not none %}\n  {% do adapter.add_time_ingestion_partition_column(partition_by, columns) %}\n{% endif %}","typeGuard":null,"tryCatchPattern":"{% try %}\n  {% do adapter.add_time_ingestion_partition_column(partition_by, columns) %}\n{% except %}\n  {{ exceptions.raise_compiler_error(\"invalid partition_by: \" ~ config.model.partition_by) }}\n{% endtry %}","preventionTips":["Derive partition_by via adapter.parse_partition_by, never raw strings","Use valid BigQuery granularity/type values in config","Avoid stringifying config dicts before macro calls","Only use this macro in BigQuery projects"],"tags":["deserialization","bigquery","partitioning"],"backgroundTag":"schema-validation-failed","analyzedSha":"0267ce9170576975b76b64ce856b2e5848e96617","analyzedAt":"2026-09-07T21:53:39.732Z","contentChangedAt":"2026-09-07T21:53:39.732Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}