duckdb-rs
duckdb-rs copied to clipboard
Interleaved connections results in table does not exist error
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");
}
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...