feat: support alter database compaction options (#7251)

Signed-off-by: WaterWhisperer <waterwhisperer24@qq.com>
This commit is contained in:
WaterWhisperer
2025-11-20 09:39:35 +08:00
committed by GitHub
parent 0cee4fa115
commit 7f1da17150
4 changed files with 332 additions and 4 deletions

View File

@@ -47,6 +47,9 @@ fn build_new_schema_value(
SetDatabaseOption::Ttl(ttl) => {
value.ttl = Some(*ttl);
}
SetDatabaseOption::Other(key, val) => {
value.extra_options.insert(key.clone(), val.clone());
}
}
}
}
@@ -54,6 +57,9 @@ fn build_new_schema_value(
for key in keys.0.iter() {
match key {
UnsetDatabaseOption::Ttl => value.ttl = None,
UnsetDatabaseOption::Other(key) => {
value.extra_options.remove(key);
}
}
}
}
@@ -234,4 +240,41 @@ mod tests {
build_new_schema_value(current_schema_value, &unset_ttl_alter_kind).unwrap();
assert_eq!(new_schema_value.ttl, None);
}
#[test]
fn test_build_new_schema_value_with_compaction_options() {
let set_compaction = AlterDatabaseKind::SetDatabaseOptions(SetDatabaseOptions(vec![
SetDatabaseOption::Other("compaction.type".to_string(), "twcs".to_string()),
SetDatabaseOption::Other("compaction.twcs.time_window".to_string(), "1d".to_string()),
]));
let current_schema_value = SchemaNameValue::default();
let new_schema_value =
build_new_schema_value(current_schema_value.clone(), &set_compaction).unwrap();
assert_eq!(
new_schema_value.extra_options.get("compaction.type"),
Some(&"twcs".to_string())
);
assert_eq!(
new_schema_value
.extra_options
.get("compaction.twcs.time_window"),
Some(&"1d".to_string())
);
let unset_compaction = AlterDatabaseKind::UnsetDatabaseOptions(UnsetDatabaseOptions(vec![
UnsetDatabaseOption::Other("compaction.type".to_string()),
]));
let new_schema_value = build_new_schema_value(new_schema_value, &unset_compaction).unwrap();
assert_eq!(new_schema_value.extra_options.get("compaction.type"), None);
assert_eq!(
new_schema_value
.extra_options
.get("compaction.twcs.time_window"),
Some(&"1d".to_string())
);
}
}

View File

@@ -47,6 +47,7 @@ use serde_with::{DefaultOnNull, serde_as};
use session::context::{QueryContextBuilder, QueryContextRef};
use snafu::{OptionExt, ResultExt};
use table::metadata::{RawTableInfo, TableId};
use table::requests::validate_database_option;
use table::table_name::TableName;
use table::table_reference::TableReference;
@@ -1059,14 +1060,21 @@ impl TryFrom<PbOption> for SetDatabaseOption {
type Error = error::Error;
fn try_from(PbOption { key, value }: PbOption) -> Result<Self> {
match key.to_ascii_lowercase().as_str() {
let key_lower = key.to_ascii_lowercase();
match key_lower.as_str() {
TTL_KEY => {
let ttl = DatabaseTimeToLive::from_humantime_or_str(&value)
.map_err(|_| InvalidSetDatabaseOptionSnafu { key, value }.build())?;
Ok(SetDatabaseOption::Ttl(ttl))
}
_ => InvalidSetDatabaseOptionSnafu { key, value }.fail(),
_ => {
if validate_database_option(&key_lower) {
Ok(SetDatabaseOption::Other(key_lower, value))
} else {
InvalidSetDatabaseOptionSnafu { key, value }.fail()
}
}
}
}
}
@@ -1074,20 +1082,29 @@ impl TryFrom<PbOption> for SetDatabaseOption {
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
pub enum SetDatabaseOption {
Ttl(DatabaseTimeToLive),
Other(String, String),
}
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
pub enum UnsetDatabaseOption {
Ttl,
Other(String),
}
impl TryFrom<&str> for UnsetDatabaseOption {
type Error = error::Error;
fn try_from(key: &str) -> Result<Self> {
match key.to_ascii_lowercase().as_str() {
let key_lower = key.to_ascii_lowercase();
match key_lower.as_str() {
TTL_KEY => Ok(UnsetDatabaseOption::Ttl),
_ => InvalidUnsetDatabaseOptionSnafu { key }.fail(),
_ => {
if validate_database_option(&key_lower) {
Ok(UnsetDatabaseOption::Other(key_lower))
} else {
InvalidUnsetDatabaseOptionSnafu { key }.fail()
}
}
}
}
}

View File

@@ -104,6 +104,216 @@ SHOW CREATE DATABASE alter_database;
| alter_database | CREATE DATABASE IF NOT EXISTS alter_database |
+----------------+----------------------------------------------+
ALTER DATABASE alter_database SET 'compaction.type'='twcs';
Affected Rows: 0
SHOW CREATE DATABASE alter_database;
+----------------+----------------------------------------------+
| Database | Create Database |
+----------------+----------------------------------------------+
| alter_database | CREATE DATABASE IF NOT EXISTS alter_database |
| | WITH( |
| | 'compaction.type' = 'twcs' |
| | ) |
+----------------+----------------------------------------------+
ALTER DATABASE alter_database SET 'compaction.twcs.time_window'='2h';
Affected Rows: 0
SHOW CREATE DATABASE alter_database;
+----------------+----------------------------------------------+
| Database | Create Database |
+----------------+----------------------------------------------+
| alter_database | CREATE DATABASE IF NOT EXISTS alter_database |
| | WITH( |
| | 'compaction.twcs.time_window' = '2h', |
| | 'compaction.type' = 'twcs' |
| | ) |
+----------------+----------------------------------------------+
ALTER DATABASE alter_database SET 'compaction.twcs.trigger_file_num'='8';
Affected Rows: 0
ALTER DATABASE alter_database SET 'compaction.twcs.max_output_file_size'='512MB';
Affected Rows: 0
SHOW CREATE DATABASE alter_database;
+----------------+-----------------------------------------------------+
| Database | Create Database |
+----------------+-----------------------------------------------------+
| alter_database | CREATE DATABASE IF NOT EXISTS alter_database |
| | WITH( |
| | 'compaction.twcs.max_output_file_size' = '512MB', |
| | 'compaction.twcs.time_window' = '2h', |
| | 'compaction.twcs.trigger_file_num' = '8', |
| | 'compaction.type' = 'twcs' |
| | ) |
+----------------+-----------------------------------------------------+
ALTER DATABASE alter_database SET 'compaction.twcs.time_window'='1d';
Affected Rows: 0
SHOW CREATE DATABASE alter_database;
+----------------+-----------------------------------------------------+
| Database | Create Database |
+----------------+-----------------------------------------------------+
| alter_database | CREATE DATABASE IF NOT EXISTS alter_database |
| | WITH( |
| | 'compaction.twcs.max_output_file_size' = '512MB', |
| | 'compaction.twcs.time_window' = '1d', |
| | 'compaction.twcs.trigger_file_num' = '8', |
| | 'compaction.type' = 'twcs' |
| | ) |
+----------------+-----------------------------------------------------+
-- SQLNESS ARG restart=true
SHOW CREATE DATABASE alter_database;
+----------------+-----------------------------------------------------+
| Database | Create Database |
+----------------+-----------------------------------------------------+
| alter_database | CREATE DATABASE IF NOT EXISTS alter_database |
| | WITH( |
| | 'compaction.twcs.max_output_file_size' = '512MB', |
| | 'compaction.twcs.time_window' = '1d', |
| | 'compaction.twcs.trigger_file_num' = '8', |
| | 'compaction.type' = 'twcs' |
| | ) |
+----------------+-----------------------------------------------------+
ALTER DATABASE alter_database UNSET 'compaction.twcs.trigger_file_num';
Affected Rows: 0
SHOW CREATE DATABASE alter_database;
+----------------+-----------------------------------------------------+
| Database | Create Database |
+----------------+-----------------------------------------------------+
| alter_database | CREATE DATABASE IF NOT EXISTS alter_database |
| | WITH( |
| | 'compaction.twcs.max_output_file_size' = '512MB', |
| | 'compaction.twcs.time_window' = '1d', |
| | 'compaction.type' = 'twcs' |
| | ) |
+----------------+-----------------------------------------------------+
ALTER DATABASE alter_database UNSET 'compaction.twcs.time_window';
Affected Rows: 0
SHOW CREATE DATABASE alter_database;
+----------------+-----------------------------------------------------+
| Database | Create Database |
+----------------+-----------------------------------------------------+
| alter_database | CREATE DATABASE IF NOT EXISTS alter_database |
| | WITH( |
| | 'compaction.twcs.max_output_file_size' = '512MB', |
| | 'compaction.type' = 'twcs' |
| | ) |
+----------------+-----------------------------------------------------+
ALTER DATABASE alter_database SET 'compaction.twcs.fallback_to_local'='true';
Affected Rows: 0
SHOW CREATE DATABASE alter_database;
+----------------+-----------------------------------------------------+
| Database | Create Database |
+----------------+-----------------------------------------------------+
| alter_database | CREATE DATABASE IF NOT EXISTS alter_database |
| | WITH( |
| | 'compaction.twcs.fallback_to_local' = 'true', |
| | 'compaction.twcs.max_output_file_size' = '512MB', |
| | 'compaction.type' = 'twcs' |
| | ) |
+----------------+-----------------------------------------------------+
ALTER DATABASE alter_database UNSET 'compaction.type';
Affected Rows: 0
ALTER DATABASE alter_database UNSET 'compaction.twcs.max_output_file_size';
Affected Rows: 0
ALTER DATABASE alter_database UNSET 'compaction.twcs.fallback_to_local';
Affected Rows: 0
SHOW CREATE DATABASE alter_database;
+----------------+----------------------------------------------+
| Database | Create Database |
+----------------+----------------------------------------------+
| alter_database | CREATE DATABASE IF NOT EXISTS alter_database |
+----------------+----------------------------------------------+
-- SQLNESS ARG restart=true
SHOW CREATE DATABASE alter_database;
+----------------+----------------------------------------------+
| Database | Create Database |
+----------------+----------------------------------------------+
| alter_database | CREATE DATABASE IF NOT EXISTS alter_database |
+----------------+----------------------------------------------+
ALTER DATABASE alter_database SET 'invalid.compaction.option'='value';
Error: 1004(InvalidArguments), Invalid set database option, key: invalid.compaction.option, value: value
ALTER DATABASE alter_database SET 'ttl'='1h';
Affected Rows: 0
ALTER DATABASE alter_database SET 'compaction.type'='twcs';
Affected Rows: 0
ALTER DATABASE alter_database SET 'compaction.twcs.time_window'='30m';
Affected Rows: 0
SHOW CREATE DATABASE alter_database;
+----------------+----------------------------------------------+
| Database | Create Database |
+----------------+----------------------------------------------+
| alter_database | CREATE DATABASE IF NOT EXISTS alter_database |
| | WITH( |
| | 'compaction.twcs.time_window' = '30m', |
| | 'compaction.type' = 'twcs', |
| | ttl = '1h' |
| | ) |
+----------------+----------------------------------------------+
ALTER DATABASE alter_database UNSET 'ttl';
Affected Rows: 0
SHOW CREATE DATABASE alter_database;
+----------------+----------------------------------------------+
| Database | Create Database |
+----------------+----------------------------------------------+
| alter_database | CREATE DATABASE IF NOT EXISTS alter_database |
| | WITH( |
| | 'compaction.twcs.time_window' = '30m', |
| | 'compaction.type' = 'twcs' |
| | ) |
+----------------+----------------------------------------------+
DROP DATABASE alter_database;
Affected Rows: 0

View File

@@ -32,5 +32,63 @@ SHOW CREATE DATABASE alter_database;
-- SQLNESS ARG restart=true
SHOW CREATE DATABASE alter_database;
ALTER DATABASE alter_database SET 'compaction.type'='twcs';
SHOW CREATE DATABASE alter_database;
ALTER DATABASE alter_database SET 'compaction.twcs.time_window'='2h';
SHOW CREATE DATABASE alter_database;
ALTER DATABASE alter_database SET 'compaction.twcs.trigger_file_num'='8';
ALTER DATABASE alter_database SET 'compaction.twcs.max_output_file_size'='512MB';
SHOW CREATE DATABASE alter_database;
ALTER DATABASE alter_database SET 'compaction.twcs.time_window'='1d';
SHOW CREATE DATABASE alter_database;
-- SQLNESS ARG restart=true
SHOW CREATE DATABASE alter_database;
ALTER DATABASE alter_database UNSET 'compaction.twcs.trigger_file_num';
SHOW CREATE DATABASE alter_database;
ALTER DATABASE alter_database UNSET 'compaction.twcs.time_window';
SHOW CREATE DATABASE alter_database;
ALTER DATABASE alter_database SET 'compaction.twcs.fallback_to_local'='true';
SHOW CREATE DATABASE alter_database;
ALTER DATABASE alter_database UNSET 'compaction.type';
ALTER DATABASE alter_database UNSET 'compaction.twcs.max_output_file_size';
ALTER DATABASE alter_database UNSET 'compaction.twcs.fallback_to_local';
SHOW CREATE DATABASE alter_database;
-- SQLNESS ARG restart=true
SHOW CREATE DATABASE alter_database;
ALTER DATABASE alter_database SET 'invalid.compaction.option'='value';
ALTER DATABASE alter_database SET 'ttl'='1h';
ALTER DATABASE alter_database SET 'compaction.type'='twcs';
ALTER DATABASE alter_database SET 'compaction.twcs.time_window'='30m';
SHOW CREATE DATABASE alter_database;
ALTER DATABASE alter_database UNSET 'ttl';
SHOW CREATE DATABASE alter_database;
DROP DATABASE alter_database;