Skip to content

Commit 35c44d1

Browse files
authored
Merge pull request #7699 from sundy-li/user-settings
chore(query): make user setting depend on a lightweight UserSettingValue
2 parents ae3855e + ccd19df commit 35c44d1

File tree

15 files changed

+196
-134
lines changed

15 files changed

+196
-134
lines changed

Cargo.lock

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/meta/types/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ doctest = false
1111
test = false
1212

1313
[dependencies]
14-
common-datavalues = { path = "../../query/datavalues" }
1514
common-exception = { path = "../../common/exception" }
1615
common-storage = { path = "../../common/storage" }
1716

1817
openraft = { git = "https://github.com/datafuselabs/openraft", tag = "v0.7.2" }
1918
sled = { git = "https://github.com/datafuse-extras/sled", tag = "v0.34.7-datafuse.1", default-features = false }
2019

2120
anyerror = "=0.1.7"
21+
chrono = "0.4.20"
2222
derive_more = "0.99.17"
2323
enumflags2 = { version = "0.7.5", features = ["serde"] }
2424
hex = "0.4.3"

src/meta/types/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,5 +196,6 @@ pub use user_privilege::UserPrivilegeSet;
196196
pub use user_privilege::UserPrivilegeType;
197197
pub use user_quota::UserQuota;
198198
pub use user_setting::UserSetting;
199+
pub use user_setting::UserSettingValue;
199200
pub use user_stage::*;
200201
pub use with::With;

src/meta/types/src/user_setting.rs

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

15-
use common_datavalues::DataValue;
15+
use core::fmt;
16+
1617
use common_exception::ErrorCode;
1718
use common_exception::Result;
1819
use serde::Deserialize;
20+
use serde::Deserializer;
1921
use serde::Serialize;
22+
use serde::Serializer;
2023

2124
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
22-
#[serde(default)]
2325
pub struct UserSetting {
2426
// The name of the setting.
2527
pub name: String,
2628
// The value of the setting.
27-
pub value: DataValue,
29+
pub value: UserSettingValue,
2830
}
29-
impl UserSetting {
30-
pub fn create(name: &str, value: DataValue) -> UserSetting {
31-
UserSetting {
32-
name: name.to_string(),
33-
value,
31+
32+
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq)]
33+
pub enum UserSettingValue {
34+
UInt64(u64),
35+
36+
// TO BE COMPATIBLE WITH old version: `String<Vec<u8>>`
37+
#[serde(deserialize_with = "deser_str_from_vu8")]
38+
#[serde(serialize_with = "str_vu8")]
39+
String(String),
40+
}
41+
42+
fn deser_str_from_vu8<'de, D>(deserializer: D) -> std::result::Result<String, D::Error>
43+
where D: Deserializer<'de> {
44+
let s: Vec<u8> = Deserialize::deserialize(deserializer)?;
45+
Ok(String::from_utf8(s).unwrap())
46+
}
47+
48+
fn str_vu8<S>(data: &String, s: S) -> std::result::Result<S::Ok, S::Error>
49+
where S: Serializer {
50+
s.serialize_bytes(data.as_bytes())
51+
}
52+
53+
impl UserSettingValue {
54+
pub fn as_u64(&self) -> Result<u64> {
55+
match self {
56+
UserSettingValue::UInt64(v) => Ok(*v),
57+
other => Result::Err(ErrorCode::BadDataValueType(format!(
58+
"Unexpected type:{:?} to get u64 number",
59+
other
60+
))),
61+
}
62+
}
63+
64+
pub fn as_string(&self) -> Result<String> {
65+
match self {
66+
UserSettingValue::String(v) => Ok(v.to_owned()),
67+
other => Result::Err(ErrorCode::BadDataValueType(format!(
68+
"Unexpected type:{:?} to get u64 number",
69+
other
70+
))),
71+
}
72+
}
73+
}
74+
75+
impl fmt::Display for UserSettingValue {
76+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
77+
match self {
78+
UserSettingValue::UInt64(v) => write!(f, "{}", v),
79+
UserSettingValue::String(v) => write!(f, "{}", v),
3480
}
3581
}
3682
}
37-
impl Default for UserSetting {
38-
fn default() -> Self {
83+
84+
impl fmt::Debug for UserSettingValue {
85+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
86+
match self {
87+
UserSettingValue::UInt64(v) => write!(f, "{}", v),
88+
UserSettingValue::String(_) => write!(f, "{}", self),
89+
}
90+
}
91+
}
92+
93+
impl UserSetting {
94+
pub fn create(name: &str, value: UserSettingValue) -> UserSetting {
3995
UserSetting {
40-
name: "".to_string(),
41-
value: DataValue::Null,
96+
name: name.to_string(),
97+
value,
4298
}
4399
}
44100
}

src/meta/types/src/user_stage.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
use std::fmt;
1616
use std::str::FromStr;
1717

18-
use common_datavalues::chrono::DateTime;
19-
use common_datavalues::chrono::Utc;
18+
use chrono::DateTime;
19+
use chrono::Utc;
2020
use common_storage::StorageParams;
2121

2222
use crate::UserIdentity;

src/query/management/tests/it/setting.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,20 @@
1515
use std::sync::Arc;
1616

1717
use common_base::base::tokio;
18-
use common_datavalues::DataValue;
1918
use common_exception::Result;
2019
use common_management::*;
2120
use common_meta_api::KVApi;
2221
use common_meta_embedded::MetaEmbedded;
2322
use common_meta_types::SeqV;
2423
use common_meta_types::UserSetting;
24+
use common_meta_types::UserSettingValue;
2525

2626
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
2727
async fn test_set_setting() -> Result<()> {
2828
let (kv_api, mgr) = new_setting_api().await?;
2929

3030
{
31-
let setting = UserSetting::create("max_threads", DataValue::UInt64(3));
31+
let setting = UserSetting::create("max_threads", UserSettingValue::UInt64(3));
3232
mgr.set_setting(setting.clone()).await?;
3333
let value = kv_api
3434
.get_kv("__fd_settings/databend_query/max_threads")
@@ -48,7 +48,7 @@ async fn test_set_setting() -> Result<()> {
4848

4949
// Set again.
5050
{
51-
let setting = UserSetting::create("max_threads", DataValue::UInt64(1));
51+
let setting = UserSetting::create("max_threads", UserSettingValue::UInt64(1));
5252
mgr.set_setting(setting.clone()).await?;
5353
let value = kv_api
5454
.get_kv("__fd_settings/databend_query/max_threads")
@@ -68,14 +68,17 @@ async fn test_set_setting() -> Result<()> {
6868

6969
// Get settings.
7070
{
71-
let expect = vec![UserSetting::create("max_threads", DataValue::UInt64(1))];
71+
let expect = vec![UserSetting::create(
72+
"max_threads",
73+
UserSettingValue::UInt64(1),
74+
)];
7275
let actual = mgr.get_settings().await?;
7376
assert_eq!(actual, expect);
7477
}
7578

7679
// Get setting.
7780
{
78-
let expect = UserSetting::create("max_threads", DataValue::UInt64(1));
81+
let expect = UserSetting::create("max_threads", UserSettingValue::UInt64(1));
7982
let actual = mgr.get_setting("max_threads", None).await?;
8083
assert_eq!(actual.data, expect);
8184
}

src/query/service/src/context_function.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ impl ContextFunction {
5353
ctx.get_connection_id().into_bytes(),
5454
))],
5555
"timezone" => vec![Expression::create_literal(DataValue::String(
56-
ctx.get_settings().get_timezone()?,
56+
ctx.get_settings().get_timezone()?.into_bytes(),
5757
))],
5858
_ => vec![],
5959
})

src/query/service/src/interpreters/interpreter_query_log.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,8 @@ impl InterpreterQueryLog {
305305
.get_settings()
306306
.get_setting_values_short()
307307
{
308-
write!(session_settings, "{}={}, ", key, value).expect("write to string must succeed");
308+
write!(session_settings, "{}={:?}, ", key, value)
309+
.expect("write to string must succeed");
309310
}
310311
session_settings.push_str("scope: SESSION");
311312

@@ -418,7 +419,8 @@ impl InterpreterQueryLog {
418419
.get_settings()
419420
.get_setting_values_short()
420421
{
421-
write!(session_settings, "{}={}, ", key, value).expect("write to string must succeed");
422+
write!(session_settings, "{}={:?}, ", key, value)
423+
.expect("write to string must succeed");
422424
}
423425
session_settings.push_str("scope: SESSION");
424426

src/query/service/src/sessions/query_ctx.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,9 +351,7 @@ impl TableContext for QueryContext {
351351
swaped_precommit_blocks
352352
}
353353
fn try_get_function_context(&self) -> Result<FunctionContext> {
354-
let tz = String::from_utf8(self.get_settings().get_timezone()?).map_err(|_| {
355-
ErrorCode::LogicalError("Timezone has been checked and should be valid.")
356-
})?;
354+
let tz = self.get_settings().get_timezone()?;
357355
let tz = tz.parse::<Tz>().map_err(|_| {
358356
ErrorCode::InvalidTimezone("Timezone has been checked and should be valid")
359357
})?;

src/query/service/src/sessions/session.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,22 +137,19 @@ impl Session {
137137
pub fn get_format_settings(&self) -> Result<FormatSettings> {
138138
let settings = &self.session_ctx.get_settings();
139139
let mut format = FormatSettings {
140-
record_delimiter: settings.get_record_delimiter()?,
141-
field_delimiter: settings.get_field_delimiter()?,
140+
record_delimiter: settings.get_record_delimiter()?.into_bytes(),
141+
field_delimiter: settings.get_field_delimiter()?.into_bytes(),
142142
empty_as_default: settings.get_empty_as_default()? > 0,
143143
skip_header: settings.get_skip_header()?,
144144
..Default::default()
145145
};
146146

147-
let tz = String::from_utf8(settings.get_timezone()?).map_err(|_| {
148-
ErrorCode::LogicalError("Timezone has been checked and should be valid.")
149-
})?;
147+
let tz = settings.get_timezone()?;
150148
format.timezone = tz.parse::<Tz>().map_err(|_| {
151149
ErrorCode::InvalidTimezone("Timezone has been checked and should be valid")
152150
})?;
153151

154-
let compress = String::from_utf8(settings.get_compression()?)
155-
.map_err(|_| ErrorCode::UnknownCompressionType("Compress type must be valid utf-8"))?;
152+
let compress = settings.get_compression()?;
156153
format.compression = compress.parse()?;
157154
format.ident_case_sensitive = settings.get_unquoted_ident_case_sensitive()?;
158155
Ok(format)

0 commit comments

Comments
 (0)