fix: enable max_execution time for other read only statements (#6454)

Also disable the timeout when timeout is 0

Signed-off-by: evenyag <realevenyag@gmail.com>
This commit is contained in:
Yingwen
2025-07-03 21:46:02 +08:00
committed by GitHub
parent 7b2703760b
commit 76a5145def
2 changed files with 68 additions and 3 deletions

View File

@@ -317,9 +317,13 @@ impl Instance {
/// For MySQL, it applies only to read-only statements.
fn derive_timeout(stmt: &Statement, query_ctx: &QueryContextRef) -> Option<Duration> {
let query_timeout = query_ctx.query_timeout()?;
match (query_ctx.channel(), stmt) {
(Channel::Mysql, Statement::Query(_)) | (Channel::Postgres, _) => Some(query_timeout),
(_, _) => None,
if query_timeout.is_zero() {
return None;
}
match query_ctx.channel() {
Channel::Mysql if stmt.is_readonly() => Some(query_timeout),
Channel::Postgres => Some(query_timeout),
_ => None,
}
}

View File

@@ -148,6 +148,67 @@ pub enum Statement {
ShowProcesslist(ShowProcessList),
}
impl Statement {
pub fn is_readonly(&self) -> bool {
match self {
// Read-only operations
Statement::Query(_)
| Statement::ShowDatabases(_)
| Statement::ShowTables(_)
| Statement::ShowTableStatus(_)
| Statement::ShowColumns(_)
| Statement::ShowCharset(_)
| Statement::ShowCollation(_)
| Statement::ShowIndex(_)
| Statement::ShowRegion(_)
| Statement::ShowCreateDatabase(_)
| Statement::ShowCreateTable(_)
| Statement::ShowCreateFlow(_)
| Statement::ShowFlows(_)
| Statement::ShowCreateView(_)
| Statement::ShowStatus(_)
| Statement::ShowSearchPath(_)
| Statement::ShowViews(_)
| Statement::DescribeTable(_)
| Statement::Explain(_)
| Statement::ShowVariables(_)
| Statement::ShowProcesslist(_)
| Statement::FetchCursor(_)
| Statement::Tql(_) => true,
#[cfg(feature = "enterprise")]
Statement::ShowTriggers(_) => true,
// Write operations
Statement::Insert(_)
| Statement::Delete(_)
| Statement::CreateTable(_)
| Statement::CreateExternalTable(_)
| Statement::CreateTableLike(_)
| Statement::CreateFlow(_)
| Statement::CreateView(_)
| Statement::DropTable(_)
| Statement::DropDatabase(_)
| Statement::DropFlow(_)
| Statement::DropView(_)
| Statement::CreateDatabase(_)
| Statement::AlterTable(_)
| Statement::AlterDatabase(_)
| Statement::Copy(_)
| Statement::TruncateTable(_)
| Statement::SetVariables(_)
| Statement::Use(_)
| Statement::DeclareCursor(_)
| Statement::CloseCursor(_)
| Statement::Kill(_)
| Statement::Admin(_) => false,
#[cfg(feature = "enterprise")]
Statement::CreateTrigger(_) | Statement::DropTrigger(_) => false,
}
}
}
impl Display for Statement {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {