From 9afc61f778a14331a5372a32bde26b1a262c7780 Mon Sep 17 00:00:00 2001 From: dennis zhuang Date: Wed, 28 May 2025 22:26:49 -0700 Subject: [PATCH] feat: supports @@session.time_zone for mysql (#6210) * feat: supports @@session.time_zone for mysql * test: assert timezone --- src/operator/src/statement.rs | 10 ++++++++-- src/servers/src/mysql/federated.rs | 1 - tests-integration/tests/sql.rs | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/operator/src/statement.rs b/src/operator/src/statement.rs index 8224308fb94..d4df416e322 100644 --- a/src/operator/src/statement.rs +++ b/src/operator/src/statement.rs @@ -380,10 +380,13 @@ impl StatementExecutor { fn set_variables(&self, set_var: SetVariables, query_ctx: QueryContextRef) -> Result { let var_name = set_var.variable.to_string().to_uppercase(); + match var_name.as_str() { "READ_PREFERENCE" => set_read_preference(set_var.value, query_ctx)?, - "TIMEZONE" | "TIME_ZONE" => set_timezone(set_var.value, query_ctx)?, + "@@TIME_ZONE" | "@@SESSION.TIME_ZONE" | "TIMEZONE" | "TIME_ZONE" => { + set_timezone(set_var.value, query_ctx)? + } "BYTEA_OUTPUT" => set_bytea_output(set_var.value, query_ctx)?, @@ -393,7 +396,7 @@ impl StatementExecutor { "DATESTYLE" => set_datestyle(set_var.value, query_ctx)?, "CLIENT_ENCODING" => validate_client_encoding(set_var)?, - "MAX_EXECUTION_TIME" => match query_ctx.channel() { + "@@SESSION.MAX_EXECUTION_TIME" | "MAX_EXECUTION_TIME" => match query_ctx.channel() { Channel::Mysql => set_query_timeout(set_var.value, query_ctx)?, Channel::Postgres => { query_ctx.set_warning(format!("Unsupported set variable {}", var_name)) @@ -432,6 +435,9 @@ impl StatementExecutor { // if query_ctx.channel() == Channel::Postgres { query_ctx.set_warning(format!("Unsupported set variable {}", var_name)); + } else if query_ctx.channel() == Channel::Mysql && var_name.starts_with("@@") { + // Just ignore `SET @@` commands for MySQL + query_ctx.set_warning(format!("Unsupported set variable {}", var_name)); } else { return NotSupportedSnafu { feat: format!("Unsupported set variable {}", var_name), diff --git a/src/servers/src/mysql/federated.rs b/src/servers/src/mysql/federated.rs index cf5f9a744da..b1ceff311de 100644 --- a/src/servers/src/mysql/federated.rs +++ b/src/servers/src/mysql/federated.rs @@ -64,7 +64,6 @@ static OTHER_NOT_SUPPORTED_STMT: Lazy = Lazy::new(|| { "(?i)^(SET TRANSACTION(.*))", "(?i)^(SET sql_mode(.*))", "(?i)^(SET SQL_SELECT_LIMIT(.*))", - "(?i)^(SET @@(.*))", "(?i)^(SET PROFILING(.*))", // mysqlclient. diff --git a/tests-integration/tests/sql.rs b/tests-integration/tests/sql.rs index 9c66f33ead3..c5a1b441d3c 100644 --- a/tests-integration/tests/sql.rs +++ b/tests-integration/tests/sql.rs @@ -336,6 +336,7 @@ pub async fn test_mysql_timezone(store_type: StorageType) { .execute("SET time_zone = 'Asia/Shanghai'") .await .unwrap(); + let timezone = conn.fetch_all("SELECT @@time_zone").await.unwrap(); assert_eq!(timezone[0].get::(0), "Asia/Shanghai"); let timezone = conn.fetch_all("SELECT @@system_time_zone").await.unwrap(); @@ -364,6 +365,9 @@ pub async fn test_mysql_timezone(store_type: StorageType) { ); let _ = conn.execute("SET time_zone = '+08:00'").await.unwrap(); + let timezone = conn.fetch_all("SELECT @@time_zone").await.unwrap(); + assert_eq!(timezone[0].get::(0), "+08:00"); + let rows2 = conn.fetch_all("select ts from demo").await.unwrap(); // we use Utc here for format only assert_eq!( @@ -373,6 +377,21 @@ pub async fn test_mysql_timezone(store_type: StorageType) { "2022-11-03T11:39:57.450Z" ); + let _ = conn + .execute("SET @@SESSION.TIME_ZONE = '-7:00'") + .await + .unwrap(); + let rows2 = conn.fetch_all("select ts from demo").await.unwrap(); + // we use Utc here for format only + assert_eq!( + rows2[0] + .get::, usize>(0) + .to_rfc3339_opts(SecondsFormat::Millis, true), + "2022-11-02T20:39:57.450Z" + ); + let timezone = conn.fetch_all("SELECT @@time_zone").await.unwrap(); + assert_eq!(timezone[0].get::(0), "-07:00"); + let _ = fe_mysql_server.shutdown().await; guard.remove_all().await; }