From 2ade896d0ae0e0f28f1457c944eb33df16a8198a Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Mon, 17 Aug 2026 04:05:46 +0000 Subject: [PATCH] fix(mysql): return XA RECOVER result sets Closes #6380 --- crates/dbx-core/src/db/mysql.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/crates/dbx-core/src/db/mysql.rs b/crates/dbx-core/src/db/mysql.rs index daf7743775..12f2452115 100644 --- a/crates/dbx-core/src/db/mysql.rs +++ b/crates/dbx-core/src/db/mysql.rs @@ -5008,6 +5008,7 @@ pub(crate) fn is_result_set_query(sql: &str, dialect: MySqlQueryDialect) -> bool &["SELECT", "SHOW", "DESCRIBE", "EXPLAIN", "WITH", "CALL"], DatabaseType::Mysql, ) || mysql_statement_returns_rows(sql) + || is_xa_recover_query(sql) || dialect.supports_admin_show_results && is_admin_show_query(sql) } @@ -5038,6 +5039,11 @@ fn mysql_statement_returns_rows(sql: &str) -> bool { } } +fn is_xa_recover_query(sql: &str) -> bool { + let tokens = leading_sql_word_tokens(sql, 2); + tokens.first().is_some_and(|token| token == "xa") && tokens.get(1).is_some_and(|token| token == "recover") +} + fn requires_text_protocol_query(sql: &str, dialect: MySqlQueryDialect) -> bool { if dialect.supports_admin_show_results && is_admin_show_query(sql) { return true; @@ -5691,6 +5697,32 @@ mod tests { assert!(prefers_text_protocol_query("CALL proc_test1()", dialect)); } + #[test] + fn mysql_xa_recover_queries_are_treated_as_text_result_sets() { + let dialect = MySqlQueryDialect::default(); + + for sql in [ + "XA RECOVER", + "xa recover convert xid;", + " -- inspect prepared transactions\nXa /* command */ ReCoVeR ;", + "# inspect prepared transactions\n/* before command */ XA\nRECOVER", + ] { + assert!(is_result_set_query(sql, dialect), "{sql}"); + assert!(prefers_text_protocol_query(sql, dialect), "{sql}"); + } + + for sql in [ + "XA START 'dbx_xid'", + "XA BEGIN 'dbx_xid'", + "XA END 'dbx_xid'", + "XA PREPARE 'dbx_xid'", + "XA COMMIT 'dbx_xid'", + "XA ROLLBACK 'dbx_xid'", + ] { + assert!(!is_result_set_query(sql, dialect), "{sql}"); + } + } + #[test] fn starrocks_admin_show_queries_are_treated_as_result_sets() { let sql = "ADMIN SHOW FRONTEND CONFIG LIKE '%default_replication_num%'";