From 95a8f3c7b168d3ad65d94c4de9144c806658a4f1 Mon Sep 17 00:00:00 2001 From: Cody Date: Sun, 5 Apr 2026 19:48:04 -0400 Subject: [PATCH] fix(catalog): consistent case handling and lock release during DDL refresh Lowercase table names from sqlite_master in list_tables() to match extract_ddl_table_name() which already lowercases. Drop the read lock on dbs before calling refresh_for_ddl() so concurrent queries aren't blocked during catalog updates. Co-Authored-By: Claude Opus 4.6 (1M context) --- crates/dkdc-db-core/src/manager.rs | 19 ++++++++++--------- crates/dkdc-db-core/src/schema.rs | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/crates/dkdc-db-core/src/manager.rs b/crates/dkdc-db-core/src/manager.rs index 869da64..0ce9ae4 100644 --- a/crates/dkdc-db-core/src/manager.rs +++ b/crates/dkdc-db-core/src/manager.rs @@ -129,16 +129,17 @@ impl DbManager { pub async fn execute(&self, db_name: &str, sql: &str) -> Result { error::validate_sql(sql)?; self.ensure_db(db_name).await?; - let dbs = self.dbs.read().await; - let managed = dbs.get(db_name).ok_or_else(|| db_not_found(db_name))?; - let result = managed.db.execute(sql).await?; + let (result, catalog, is_ddl) = { + let dbs = self.dbs.read().await; + let managed = dbs.get(db_name).ok_or_else(|| db_not_found(db_name))?; + let result = managed.db.execute(sql).await?; + let catalog = managed.catalog.clone(); + let is_ddl = router::is_ddl(sql); + (result, catalog, is_ddl) + }; // read lock released here // Refresh catalog if DDL (selective: only the affected table) - if router::is_ddl(sql) { - managed - .catalog - .schema_provider() - .refresh_for_ddl(sql) - .await?; + if is_ddl { + catalog.schema_provider().refresh_for_ddl(sql).await?; } Ok(result) } diff --git a/crates/dkdc-db-core/src/schema.rs b/crates/dkdc-db-core/src/schema.rs index 3996c1a..662ee3b 100644 --- a/crates/dkdc-db-core/src/schema.rs +++ b/crates/dkdc-db-core/src/schema.rs @@ -81,7 +81,7 @@ pub async fn list_tables(conn: &turso::Connection) -> Result> { let mut tables = Vec::new(); while let Some(row) = rows.next().await? { let name: String = row.get(0)?; - tables.push(name); + tables.push(name.to_lowercase()); } Ok(tables) }