mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-10-29 23:16:57 +00:00
feat: supports @@session.time_zone for mysql (#6210)
* feat: supports @@session.time_zone for mysql * test: assert timezone
This commit is contained in:
@@ -380,10 +380,13 @@ impl StatementExecutor {
|
||||
|
||||
fn set_variables(&self, set_var: SetVariables, query_ctx: QueryContextRef) -> Result<Output> {
|
||||
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),
|
||||
|
||||
@@ -64,7 +64,6 @@ static OTHER_NOT_SUPPORTED_STMT: Lazy<RegexSet> = Lazy::new(|| {
|
||||
"(?i)^(SET TRANSACTION(.*))",
|
||||
"(?i)^(SET sql_mode(.*))",
|
||||
"(?i)^(SET SQL_SELECT_LIMIT(.*))",
|
||||
"(?i)^(SET @@(.*))",
|
||||
"(?i)^(SET PROFILING(.*))",
|
||||
|
||||
// mysqlclient.
|
||||
|
||||
@@ -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::<String, usize>(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::<String, usize>(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::<chrono::DateTime<Utc>, 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::<String, usize>(0), "-07:00");
|
||||
|
||||
let _ = fe_mysql_server.shutdown().await;
|
||||
guard.remove_all().await;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user