duckdb-rs icon indicating copy to clipboard operation
duckdb-rs copied to clipboard

Interleaved connections results in table does not exist error

Open ankrgyl opened this issue 2 years ago • 1 comments

If you open a connection (e.g. conn1 below) and then perform DDL, the original connection doesn't see the new DDL.

Here's some very basic sample code that fails:

use duckdb::Connection;

fn run_query(conn: &mut Connection, query: &str) {
    let mut stmt = conn.prepare(query).unwrap();
    let query_result = stmt.query_arrow([]).unwrap();
    eprintln!("RESULT: {:?}", query_result.collect::<Vec<_>>());
}

fn main() {
    let _ = std::fs::remove_file("/tmp/test_duckdb_concurrency.duckdb");
    let url = "/tmp/test_duckdb_concurrency.duckdb";

    let mut conn = Connection::open_with_flags(
        url,
        duckdb::Config::default()
            .access_mode(duckdb::AccessMode::ReadWrite)
            .unwrap(),
    )
    .unwrap();
    run_query(&mut conn, "DROP TABLE IF EXISTS t");
    run_query(&mut conn, "CREATE TABLE t AS SELECT 1 AS a");

    let mut conn1 = Connection::open_with_flags(
        url,
        duckdb::Config::default()
            .access_mode(duckdb::AccessMode::ReadWrite)
            .unwrap(),
    )
    .unwrap();
    let mut conn2 = Connection::open_with_flags(
        url,
        duckdb::Config::default()
            .access_mode(duckdb::AccessMode::ReadWrite)
            .unwrap(),
    )
    .unwrap();
    run_query(&mut conn2, "CREATE OR REPLACE VIEW x AS SELECT * FROM t");

    run_query(&mut conn2, "SELECT * FROM x");

    run_query(&mut conn1, "SELECT * FROM t");
    run_query(&mut conn1, "SELECT * FROM x");
}

ankrgyl avatar Feb 06 '23 06:02 ankrgyl

NOTE: This is resolved by cloning conn1 instead of creating a new connection. I looked at the Python driver's code, and it maintains a global cache to avoid this...

ankrgyl avatar Feb 06 '23 06:02 ankrgyl