dbt-labs/dbt-core · error · minijinja::Error::SerdeDeserializeError
adapter.add_time_ingestion_partition_column failed on partit
Error message
adapter.add_time_ingestion_partition_column failed on partition_by {partition_by:?}: {e} What it means
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.
Source
Thrown at crates/dbt-adapter/src/adapter/mod.rs:2243
_state: &State,
args: &[Value],
) -> Result<Value, minijinja::Error> {
match &self.inner {
Typed { adapter, .. } => {
let iter = ArgsIter::new(
"add_time_ingestion_partition_column",
&["partition_by", "columns"],
args,
);
let partition_by = iter.next_arg::<&Value>()?;
let columns = iter.next_arg::<&Value>()?;
iter.finish()?;
// Match original behavior: try to deserialize directly, let deserialization handle errors
let partition_by =
minijinja_value_to_typed_struct::<PartitionConfig>(partition_by.clone())
.map_err(|e| {
minijinja::Error::new(
minijinja::ErrorKind::SerdeDeserializeError,
format!(
"adapter.add_time_ingestion_partition_column failed on partition_by {partition_by:?}: {e}"
),
)
})?;
let partition_config = partition_by.into_bigquery().ok_or_else(|| {
minijinja::Error::new(
minijinja::ErrorKind::InvalidArgument,
"Expect a BigqueryPartitionConfigStruct",
)
})?;
let result = adapter
.add_time_ingestion_partition_column(columns.clone(), partition_config)?;
Ok(result)
}View on GitHub (pinned to 0267ce9170)
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.
Example fix
// before
{% do adapter.add_time_ingestion_partition_column(config.model.partition_by, columns) %}
// after
{% set partition_by = adapter.parse_partition_by(config.model.partition_by) %}
{% do adapter.add_time_ingestion_partition_column(partition_by, columns) %} Defensive patterns
Strategy: validation
Validate before calling
{% set partition_by = adapter.parse_partition_by(config.model.partition_by) %}
{% if partition_by is not none %}
{% do adapter.add_time_ingestion_partition_column(partition_by, columns) %}
{% endif %} Try / catch
{% try %}
{% do adapter.add_time_ingestion_partition_column(partition_by, columns) %}
{% except %}
{{ exceptions.raise_compiler_error("invalid partition_by: " ~ config.model.partition_by) }}
{% endtry %} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- when data_type is date, inner must be a TimeConfig
- adapter.parse_partition_by failed on {raw_partition_by:?}: {
- Expect a BigqueryPartitionConfigStruct
- Expect a BigqueryPartitionConfigStruct
- get_table_options: Failed to deserialize InternalDbtNodeWrap
AI-assisted analysis of dbt-labs/dbt-core@0267ce9170 (2026-09-07).
Data as JSON: /api/errors/ce13aadd4508eac8.
Report an issue: GitHub.