fix(mysql): return XA RECOVER result sets

Closes #6380
This commit is contained in:
t8y2 committed 2026-08-17 04:08:54 +00:00
1 parent 520de302dd
commit 2ade896d0a
1 file changed
+32
+32
View File
@@ -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%'";