Skip to content

Commit e9cc22c

Browse files
authored
fix: return timezone when set in query level. (#18952)
* ci: drop table at end of test * ci: support ttc_dev for developing drivers. * fix: return timezone when set in query level.
1 parent 3efed0c commit e9cc22c

File tree

7 files changed

+50
-26
lines changed

7 files changed

+50
-26
lines changed

src/query/service/src/servers/http/v1/http_query_handlers.rs

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,9 @@ pub struct QueryResponse {
161161
pub data: Arc<BlocksSerializer>,
162162
pub affect: Option<QueryAffect>,
163163
pub result_timeout_secs: Option<u64>,
164-
// settings also used by driver, may be set in session or global
164+
// settings also used by driver, may be set in query/session/global level
165165
// only include timezone for now
166-
// only is_some in the initial response
166+
// only available after binding
167167
#[serde(skip_serializing_if = "Option::is_none")]
168168
pub settings: Option<BTreeMap<String, String>>,
169169

@@ -195,11 +195,11 @@ impl QueryResponse {
195195
affect,
196196
error,
197197
warnings,
198+
driver_settings,
198199
},
199200
}: HttpQueryResponseInternal,
200201
is_final: bool,
201202
body_format: BodyFormat,
202-
settings: Option<BTreeMap<String, String>>,
203203
) -> Response {
204204
let (data, next_uri) = if is_final {
205205
(Arc::new(BlocksSerializer::empty()), None)
@@ -264,7 +264,7 @@ impl QueryResponse {
264264
error: error.map(QueryError::from_error_code),
265265
has_result_set,
266266
result_timeout_secs: Some(result_timeout_secs),
267-
settings,
267+
settings: driver_settings,
268268
};
269269

270270
match body_format {
@@ -397,7 +397,6 @@ async fn query_final_handler(
397397
response,
398398
true,
399399
body_format,
400-
None,
401400
))
402401
}
403402
None => Err(query_id_not_found(&query_id, &ctx.node_id)),
@@ -528,7 +527,6 @@ async fn query_page_handler(
528527
resp,
529528
false,
530529
body_format,
531-
None,
532530
))
533531
}
534532
}
@@ -587,14 +585,6 @@ pub(crate) async fn query_handler(
587585
Ok(req.fail_to_start_sql(err).into_response())
588586
}
589587
Ok(mut query) => {
590-
let settings = query.execute_state.lock().get_session_state().settings;
591-
let tz = settings.get_timezone().unwrap();
592-
let driver_settings = if tz == "UTC" {
593-
None
594-
} else {
595-
Some(BTreeMap::from_iter([("timezone".to_string(), tz)]))
596-
};
597-
598588
if let Err(err) = query.start_query(sql.clone()).await {
599589
let err = err.display_with_sql(&sql);
600590
error!("[HTTP-QUERY] Failed to start SQL query, error: {:?}", err);
@@ -630,14 +620,10 @@ pub(crate) async fn query_handler(
630620
query
631621
.update_expire_time(false, resp.is_data_drained())
632622
.await;
633-
Ok(QueryResponse::from_internal(
634-
query.id.to_string(),
635-
resp,
636-
false,
637-
body_format,
638-
driver_settings,
623+
Ok(
624+
QueryResponse::from_internal(query.id.to_string(), resp, false, body_format)
625+
.into_response(),
639626
)
640-
.into_response())
641627
}
642628
}
643629
};

src/query/service/src/servers/http/v1/query/execute_state.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
use std::collections::BTreeMap;
1516
use std::collections::HashMap;
1617
use std::sync::Arc;
1718
use std::time::SystemTime;
@@ -129,13 +130,15 @@ pub struct ExecuteRunning {
129130
// mainly used to get progress for now
130131
pub(crate) ctx: Arc<QueryContext>,
131132
schema: DataSchemaRef,
133+
driver_settings: Option<BTreeMap<String, String>>,
132134
has_result_set: bool,
133135
#[allow(dead_code)]
134136
queue_guard: AcquireQueueGuard,
135137
}
136138

137139
pub struct ExecuteStopped {
138140
pub schema: DataSchemaRef,
141+
pub driver_settings: Option<BTreeMap<String, String>>,
139142
pub has_result_set: Option<bool>,
140143
pub stats: Progresses,
141144
pub affect: Option<QueryAffect>,
@@ -197,11 +200,18 @@ impl Executor {
197200
Stopped(f) => f.schema.clone(),
198201
};
199202

203+
let driver_settings = match &self.state {
204+
Starting(_) => None,
205+
Running(r) => r.driver_settings.clone(),
206+
Stopped(f) => f.driver_settings.clone(),
207+
};
208+
200209
ResponseState {
201210
running_time_ms: self.get_query_duration_ms(),
202211
progresses: self.get_progress(),
203212
state: exe_state,
204213
error: err,
214+
driver_settings,
205215
warnings: self.get_warnings(),
206216
affect: self.get_affect(),
207217
schema,
@@ -309,6 +319,7 @@ impl Executor {
309319
ExecuteStopped {
310320
stats: Default::default(),
311321
schema: Default::default(),
322+
driver_settings: None,
312323
has_result_set: None,
313324
reason: reason.clone(),
314325
session_state: ExecutorSessionState::new(s.ctx.get_current_session()),
@@ -331,6 +342,7 @@ impl Executor {
331342
ExecuteStopped {
332343
stats: Progresses::from_context(&r.ctx),
333344
schema: r.schema.clone(),
345+
driver_settings: r.driver_settings.clone(),
334346
has_result_set: Some(r.has_result_set),
335347
reason: reason.clone(),
336348
session_state: ExecutorSessionState::new(r.ctx.get_current_session()),
@@ -389,12 +401,15 @@ impl ExecuteState {
389401
} else {
390402
Default::default()
391403
};
404+
let tz = ctx.get_settings().get_timezone().with_context(make_error)?;
405+
let driver_settings = Some(BTreeMap::from_iter([("timezone".to_string(), tz)]));
392406

393407
let running_state = ExecuteRunning {
394408
session,
395409
ctx: ctx.clone(),
396410
queue_guard,
397411
schema,
412+
driver_settings,
398413
has_result_set,
399414
};
400415
info!("[HTTP-QUERY] Query state changed to Running");

src/query/service/src/servers/http/v1/query/http_query.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,7 @@ pub struct StageAttachmentConf {
491491
pub struct ResponseState {
492492
pub has_result_set: Option<bool>,
493493
pub schema: DataSchemaRef,
494+
pub driver_settings: Option<BTreeMap<String, String>>,
494495
pub running_time_ms: i64,
495496
pub progresses: Progresses,
496497
pub state: ExecuteStateKind,
@@ -847,6 +848,7 @@ impl HttpQuery {
847848
let state = ExecuteStopped {
848849
stats: Progresses::default(),
849850
schema: Default::default(),
851+
driver_settings: None,
850852
has_result_set: None,
851853
reason: Err(e.clone()),
852854
session_state: ExecutorSessionState::new(

tests/nox/suites/1_stateful/09_http_handler/test_09_0001_json_response.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,22 @@ def test_json_response_errors():
4444
assert response3.json() == json.loads(
4545
'{"error": {"code": 404, "message": "not found"}}'
4646
)
47+
48+
def query_page_0(sql):
49+
data = {
50+
'sql': sql,
51+
"pagination": { "wait_time_secs": 5}
52+
}
53+
data = json.dumps(data)
54+
response = requests.post(
55+
query_url,
56+
auth=auth,
57+
headers={"Content-Type": "application/json"},
58+
data=data,
59+
)
60+
return response.json()
61+
62+
def test_timezone():
63+
timezone = 'Asia/Shanghai'
64+
r = query_page_0(f"settings (timezone='{timezone}') select 1")
65+
assert r.get('settings', {}).get('timezone') == timezone

tests/nox/suites/1_stateful/09_http_handler/test_09_0014_query_lifecycle.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ def test_query_lifecycle_finalized(rows):
191191

192192
# not return session since nothing changed
193193
exp["session"] = None
194-
del exp["settings"] # only in the first resp
195194
exp["state"] = "Succeeded"
196195
if rows == 8:
197196
exp["next_uri"] = f"/v1/query/{query_id}/page/2"

tests/sqllogictests/src/main.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ mod util;
5757
const HANDLER_MYSQL: &str = "mysql";
5858
const HANDLER_HTTP: &str = "http";
5959
const HANDLER_HYBRID: &str = "hybrid";
60-
const HANDLER_TTC_RUST: &str = "ttc_rust";
6160
const TTC_PORT_START: u16 = 9902;
6261

6362
use std::sync::LazyLock;
@@ -136,10 +135,11 @@ pub async fn main() -> Result<()> {
136135
HANDLER_HYBRID => {
137136
run_hybrid_client(args.clone(), &mut containers).await?;
138137
}
139-
HANDLER_TTC_RUST => {}
140138
handler if handler.starts_with("ttc") => {
141-
let image = format!("ghcr.io/databendlabs/{handler}:latest");
142-
run_ttc_container(&image, TTC_PORT_START, args.port, &mut containers).await?;
139+
if handler != "ttc_dev" {
140+
let image = format!("ghcr.io/databendlabs/{handler}:latest");
141+
run_ttc_container(&image, TTC_PORT_START, args.port, &mut containers).await?;
142+
}
143143
run_ttc_client(
144144
args.clone(),
145145
ClientType::Ttc(handler.to_string(), TTC_PORT_START),

tests/sqllogictests/suites/base/05_ddl/05_0037_ddl_dictionary.test

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,6 @@ dd2 CREATE DICTIONARY dd2 ( c1 INT NOT NULL, c2 VARCHAR NOT NULL ) PRIMARY KEY c
145145

146146
statement ok
147147
DROP DATABASE db1
148+
149+
statement ok
150+
DROP DICTIONARY IF EXISTS default.dd2

0 commit comments

Comments
 (0)