{"record":{"id":"e5982c2badc068a3","repo":"dbt-labs/dbt-core","slug":"salesforceadapter-does-not-implement-build-columns","errorCode":null,"errorMessage":"SalesforceAdapter does not implement build_columns_from_get_columns","messagePattern":"SalesforceAdapter does not implement build_columns_from_get_columns","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/dbt-adapter/src/metadata/salesforce/mod.rs","lineNumber":43,"sourceCode":"impl MetadataAdapter for SalesforceMetadataAdapter {\n    fn adapter_type(&self) -> AdapterType {\n        AdapterType::Salesforce\n    }\n\n    fn build_schemas_from_stats_sql(\n        &self,\n        _: Arc<RecordBatch>,\n    ) -> AdapterResult<BTreeMap<String, dbt_schemas::schemas::legacy_catalog::CatalogTable>> {\n        unimplemented!(\"SalesforceAdapter does not implement build_schemas_from_stats_sql\");\n    }\n\n    fn build_columns_from_get_columns(\n        &self,\n        _: Arc<RecordBatch>,\n    ) -> AdapterResult<\n        BTreeMap<String, BTreeMap<String, dbt_schemas::schemas::legacy_catalog::ColumnMetadata>>,\n    > {\n        unimplemented!(\"SalesforceAdapter does not implement build_columns_from_get_columns\");\n    }\n\n    fn list_user_defined_functions_inner(\n        &self,\n        _catalog_schemas: &BTreeMap<String, BTreeSet<String>>,\n        _token: CancellationToken,\n    ) -> AsyncAdapterResult<'_, Vec<UDF>> {\n        let future = std::future::ready(Ok(Default::default()));\n        Box::pin(future)\n    }\n\n    fn list_relations_schemas_inner(\n        &self,\n        _unique_id: Option<String>,\n        _phase: Option<ExecutionPhase>,\n        _relations: &[Arc<dyn BaseRelation>],\n        _token: CancellationToken,\n    ) -> AsyncAdapterResult<'_, HashMap<String, AdapterResult<Arc<Schema>>>> {","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/dbt-labs/dbt-core/blob/0267ce9170576975b76b64ce856b2e5848e96617/crates/dbt-adapter/src/metadata/salesforce/mod.rs#L25-L61","documentation":"build_columns_from_get_columns converts a RecordBatch from the driver's get-columns call into per-table ColumnMetadata maps. SalesforceAdapter stubs this trait method with unimplemented!(), so any attempt to build column metadata through this path panics unconditionally — the Salesforce adapter does not implement this catalog conversion step.","triggerScenarios":"Invoking SalesforceAdapter::build_columns_from_get_columns, e.g. during docs/catalog generation or cache population that routes through the get_columns RecordBatch path for Salesforce connections.","commonSituations":"Running 'dbt docs generate' or catalog ingestion against a Salesforce profile; generic tooling that calls the metadata builder uniformly across adapters; tests exercising the full metadata pipeline with a Salesforce adapter instance.","solutions":["Exclude Salesforce adapters from catalog/column-metadata harvesting workflows.","Use Salesforce's own schema discovery (describe objects via the API) instead of the RecordBatch get-columns path.","If needed, implement build_columns_from_get_columns for SalesforceAdapter mapping SObject fields to ColumnMetadata."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"if adapter.type() == \"salesforce\" { use_salesforce_describe_metadata(); }","typeGuard":"fn supports_get_columns_metadata(t: &AdapterType) -> bool { *t != AdapterType::Salesforce }","tryCatchPattern":null,"preventionTips":["Route Salesforce metadata discovery through its native API path, not the generic get-columns pipeline.","Filter adapters by supported capabilities before metadata harvesting.","Document which adapters implement catalog column building."],"tags":["unimplemented","salesforce","metadata","catalog"],"backgroundTag":"method-not-implemented","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"}