{"record":{"id":"b44455b8ccb5f69c","repo":"dbt-labs/dbt-core","slug":"adapter-should-be-available-during-parse-phase","errorCode":null,"errorMessage":"Adapter should be available during parse phase","messagePattern":"Adapter should be available during parse phase","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/dbt-parser/src/renderer.rs","lineNumber":829,"sourceCode":"    node_resolver: &NodeResolver,\n    jinja_env: Arc<JinjaEnv>,\n    adapter_type: AdapterType,\n    package_name: &str,\n    root_project_name: &str,\n    runtime_config: Arc<DbtRuntimeConfig>,\n    token: &CancellationToken,\n) -> FsResult<Vec<(T, bool)>> {\n    if node_map.is_empty() {\n        return Ok(Vec::new());\n    }\n\n    let max_concurrency = crate::parallel::effective_parallelism(arg.no_parallel);\n    let model_vec: Vec<(String, T)> = node_map.into_iter().collect();\n    let chunk_size = model_vec.len().div_ceil(max_concurrency);\n\n    let parse_adapter = jinja_env\n        .get_adapter()\n        .expect(\"Adapter should be available during parse phase\");\n\n    let chunks = chunk_vec(model_vec, chunk_size);\n\n    let arg = Arc::new(arg.clone());\n    let node_resolver = Arc::new(node_resolver.clone());\n    let package_name = package_name.to_string();\n    let root_project_name = root_project_name.to_string();\n    let token = token.clone();\n\n    let chunk_results =\n        crate::parallel::dispatch_maybe_parallel(chunks, max_concurrency > 1, move |chunk| {\n            let arg = arg.clone();\n            let node_resolver = node_resolver.clone();\n            let jinja_env = jinja_env.clone();\n            let package_name = package_name.clone();\n            let root_project_name = root_project_name.clone();\n            let runtime_config = runtime_config.clone();\n            let parse_adapter = parse_adapter.clone();","sourceCodeStart":811,"sourceCodeEnd":847,"githubUrl":"https://github.com/dbt-labs/dbt-core/blob/0267ce9170576975b76b64ce856b2e5848e96617/crates/dbt-parser/src/renderer.rs#L811-L847","documentation":"A panic from `.expect()` in `collect_adapter_identifiers_detect_unsafe` (called by `resolve_models`, `resolve_snapshots`, `resolve_data_tests`). Before chunked model rendering, the code fetches the adapter from the Jinja environment to scan for unsafe identifiers; if no adapter was attached to the environment, resolution cannot proceed and it panics. Adapter presence during parse is a hard requirement of these resolution paths.","triggerScenarios":"Calling `resolve_models`/`resolve_snapshots`/`resolve_data_tests` with a Jinja env created via `get_adapter()` returning None — i.e., the environment was built without `set_adapter` or the adapter was cleared before resolution.","commonSituations":"Embedding dbt-parser's resolution APIs in tooling/tests without full adapter bootstrapping; refactors that delay adapter attachment; adapter initialization failures silently swallowed earlier in setup.","solutions":["Attach the adapter to the Jinja environment before calling any resolve_* function","Use the standard parse pipeline (parse/resolve entry points) that guarantees adapter wiring","Assert adapter presence early in your harness to fail fast with a clear message","Check adapter construction logs for earlier silent failures"],"exampleFix":"// before\nlet jinja_env = JinjaEnv::new(...);\nresolve_models(&jinja_env, ...); // panics: no adapter\n\n// after\nlet jinja_env = Jinja_env::new(...);\njinja_env.set_adapter(adapter.clone());\nresolve_models(&jinja_env, ...);","handlingStrategy":"validation","validationCode":"if jinja_env.get_adapter().is_none() {\n    return Err(\"adapter must be attached to the Jinja env before resolve_*\".into());\n}","typeGuard":"fn adapter_attached(env: &JinjaEnv) -> bool {\n    env.get_adapter().is_some()\n}","tryCatchPattern":null,"preventionTips":["Attach the adapter to the env before resolution, never after","Fail fast in setup code if adapter wiring fails instead of continuing silently","Prefer official parse pipeline entry points in integrations"],"tags":["rust","adapter","parse-phase","panic","resolution"],"backgroundTag":"internal-invariant-violation","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"}