diff --git a/src/api/database/sql_console.rs b/src/api/database/sql_console.rs index 296f33d..2d60297 100644 --- a/src/api/database/sql_console.rs +++ b/src/api/database/sql_console.rs @@ -191,6 +191,16 @@ fn is_read_only(stmt: &sqlparser::ast::Statement) -> bool { matches!(stmt, Statement::Query(_) | Statement::Explain { .. }) } +/// 判断一组语句中是否含有写操作(非只读语句)。 +/// +/// SQL 控制台执行写操作(INSERT/UPDATE/DELETE/TRUNCATE/ALTER/DROP 等)可能直改 +/// posts/comments/tags 等业务表,绕过 server function 的正常缓存失效路径。 +/// 抽成纯函数便于单测「哪些语句集合应触发兜底失效」。 +#[cfg(feature = "server")] +fn writes_affect_cache(stmts: &[sqlparser::ast::Statement]) -> bool { + stmts.iter().any(|s| !is_read_only(s)) +} + /// 把一列的值转成 JSON(按 PG 类型名分发)。 #[cfg(feature = "server")] fn col_to_json(row: &tokio_postgres::Row, idx: usize) -> serde_json::Value { @@ -305,6 +315,18 @@ pub async fn execute_sql(sql: String, opts: ExecuteSqlOpts) -> Result