From 38eba3956c2a7b03dd7dfbfbcc86ab08d802cc35 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Fri, 15 May 2026 18:33:32 +0800 Subject: [PATCH] fix(mysql): return rows for with queries --- crates/dbx-core/src/db/mysql.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/dbx-core/src/db/mysql.rs b/crates/dbx-core/src/db/mysql.rs index 8cc5ccb523..72295d86df 100644 --- a/crates/dbx-core/src/db/mysql.rs +++ b/crates/dbx-core/src/db/mysql.rs @@ -282,7 +282,7 @@ pub async fn get_columns(pool: &MySqlPool, database: &str, table: &str) -> Resul pub async fn execute_query(pool: &MySqlPool, sql: &str, bare: bool) -> Result { let start = Instant::now(); - if starts_with_executable_sql_keyword(sql, &["SELECT", "SHOW", "DESCRIBE", "EXPLAIN"]) { + if is_result_set_query(sql) { if bare { let mut stream = sqlx::raw_sql(sql).fetch(&*pool); let mut columns: Vec = vec![]; @@ -363,6 +363,10 @@ pub async fn execute_query(pool: &MySqlPool, sql: &str, bare: bool) -> Result bool { + starts_with_executable_sql_keyword(sql, &["SELECT", "SHOW", "DESCRIBE", "EXPLAIN", "WITH"]) +} + pub async fn list_indexes(pool: &MySqlPool, database: &str, table: &str) -> Result, String> { let sql = format!( "SELECT INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS columns, \ @@ -444,6 +448,13 @@ pub async fn list_triggers(pool: &MySqlPool, database: &str, table: &str) -> Res mod tests { use super::*; + #[test] + fn mysql_with_queries_are_treated_as_result_sets() { + let sql = "WITH RECURSIVE org_tree AS (SELECT 1 AS id) SELECT id FROM org_tree"; + + assert!(is_result_set_query(sql)); + } + #[test] fn numeric_metadata_accepts_unsigned_information_schema_values() { assert_eq!(numeric_metadata_u64_to_i32(Some(65)), Some(65));