dbt-labs/dbt-core · error

ReplayStatement::bind_stream

Error message

ReplayStatement::bind_stream

What it means

todo!() stub in the ADBC record-replay backend: ReplayStatement::bind_stream (binding parameters from a RecordBatchReader stream) is not implemented for replay mode. Any ADBC client that streams parameter batches through this statement will abort here — only ingestion via the non-streaming bind or replayed DML is available.

Source

Thrown at crates/adbc-record-replay/src/replay.rs:221

        ctx: RecordingContext,
    ) -> Self {
        Self {
            recordings_path,
            config,
            ctx,
            sql: None,
            recorded_options: BTreeMap::new(),
        }
    }
}

impl Statement for ReplayStatement {
    fn bind(&mut self, _batch: RecordBatch) -> AdbcResult<()> {
        todo!("ReplayStatement::bind")
    }

    fn bind_stream(&mut self, _reader: Box<dyn RecordBatchReader + Send>) -> AdbcResult<()> {
        todo!("ReplayStatement::bind_stream")
    }

    #[allow(deprecated)]
    fn execute<'a>(&'a mut self) -> AdbcResult<Box<dyn RecordBatchReader + Send + 'a>> {
        let replay_sql = match &self.sql {
            Some(sql) => sql,
            None => "none",
        };

        let path = self.recordings_path.clone();
        let unique_id = compute_file_name(
            &path,
            self.ctx.node_id.as_ref(),
            Some(replay_sql),
            self.ctx.metadata,
        )?;

        let storage_type = crate::storage::detect_storage_type(&path, &unique_id);

View on GitHub (pinned to 0267ce9170)

Solutions

  1. Avoid bind_stream() in recorded workloads; materialize parameters into the SQL or skip replay for such statements
  2. Implement ReplayStatement::bind_stream to persist and replay stream data
  3. Return a proper Status::NotImplemented error instead of panicking
  4. Use the real ADBC driver when stream binding is required

Example fix

// before
fn bind_stream(&mut self, _reader: Box<dyn RecordBatchReader + Send>) -> AdbcResult<()> {
    todo!("ReplayStatement::bind_stream")
}
// after
fn bind_stream(&mut self, _reader: Box<dyn RecordBatchReader + Send>) -> AdbcResult<()> {
    Err(adbc_core::error::Error::with_message(
        Status::NotImplemented,
        "bind_stream is not supported by the replay driver".into(),
    ))
}
Defensive patterns

Strategy: validation

Validate before calling

fn replay_supports_bind_stream(stmt: &ReplayStatement) -> bool {
    false // bind_stream is not implemented in the replay driver
}

Try / catch

if replay_supports_bind_stream(&stmt) {
    stmt.bind_stream(reader)?;
} else {
    return Err(anyhow!("bind_stream unsupported on replay driver"));
}

Prevention

When it happens

Trigger: Calling Statement::bind_stream with a Box<dyn RecordBatchReader + Send> on a record-replay driver statement.

Common situations: Replaying parameterized queries that bind large datasets via streams; generic ADBC client code that calls bind_stream on every statement regardless of driver support.

Related errors


AI-assisted analysis of dbt-labs/dbt-core@0267ce9170 (2026-09-07). Data as JSON: /api/errors/3e63b008189bd033. Report an issue: GitHub.