feat: distributed alter table in region server (#2311)

* feat: distributed alter table in region server

* rebase
This commit is contained in:
LFC
2023-09-05 14:07:50 +08:00
committed by Ruihang Xia
parent 922e342b63
commit 711e27d9fa
33 changed files with 902 additions and 381 deletions

View File

@@ -12,10 +12,12 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use api::v1::add_column::location::LocationType;
use api::v1::add_column::Location;
use api::v1::add_column_location::LocationType;
use api::v1::alter_expr::Kind;
use api::v1::{column_def, AlterExpr, CreateTableExpr, DropColumns, RenameTable};
use api::v1::{
column_def, AddColumnLocation as Location, AlterExpr, CreateTableExpr, DropColumns,
RenameTable, SemanticType,
};
use common_catalog::consts::{DEFAULT_CATALOG_NAME, DEFAULT_SCHEMA_NAME};
use common_query::AddColumnLocation;
use datatypes::schema::{ColumnSchema, RawSchema};
@@ -55,7 +57,7 @@ pub fn alter_expr_to_request(table_id: TableId, expr: AlterExpr) -> Result<Alter
)?;
Ok(AddColumnRequest {
column_schema: schema,
is_key: ac.is_key,
is_key: column_def.semantic_type == SemanticType::Tag as i32,
location: parse_location(ac.location)?,
})
})
@@ -79,7 +81,7 @@ pub fn alter_expr_to_request(table_id: TableId, expr: AlterExpr) -> Result<Alter
table_name: expr.table_name,
table_id,
alter_kind,
table_version: Some(expr.table_version),
table_version: None,
};
Ok(request)
}
@@ -197,8 +199,7 @@ fn parse_location(location: Option<Location>) -> Result<Option<AddColumnLocation
#[cfg(test)]
mod tests {
use api::v1::add_column::location::LocationType;
use api::v1::{AddColumn, AddColumns, ColumnDataType, ColumnDef, DropColumn};
use api::v1::{AddColumn, AddColumns, ColumnDataType, ColumnDef, DropColumn, SemanticType};
use datatypes::prelude::ConcreteDataType;
use super::*;
@@ -214,15 +215,14 @@ mod tests {
add_columns: vec![AddColumn {
column_def: Some(ColumnDef {
name: "mem_usage".to_string(),
datatype: ColumnDataType::Float64 as i32,
data_type: ColumnDataType::Float64 as i32,
is_nullable: false,
default_constraint: vec![],
semantic_type: SemanticType::Field as i32,
}),
is_key: false,
location: None,
}],
})),
..Default::default()
};
let alter_request = alter_expr_to_request(1, expr).unwrap();
@@ -255,11 +255,11 @@ mod tests {
AddColumn {
column_def: Some(ColumnDef {
name: "mem_usage".to_string(),
datatype: ColumnDataType::Float64 as i32,
data_type: ColumnDataType::Float64 as i32,
is_nullable: false,
default_constraint: vec![],
semantic_type: SemanticType::Field as i32,
}),
is_key: false,
location: Some(Location {
location_type: LocationType::First.into(),
after_column_name: "".to_string(),
@@ -268,11 +268,11 @@ mod tests {
AddColumn {
column_def: Some(ColumnDef {
name: "cpu_usage".to_string(),
datatype: ColumnDataType::Float64 as i32,
data_type: ColumnDataType::Float64 as i32,
is_nullable: false,
default_constraint: vec![],
semantic_type: SemanticType::Field as i32,
}),
is_key: false,
location: Some(Location {
location_type: LocationType::After.into(),
after_column_name: "ts".to_string(),
@@ -280,7 +280,6 @@ mod tests {
},
],
})),
..Default::default()
};
let alter_request = alter_expr_to_request(1, expr).unwrap();
@@ -329,7 +328,6 @@ mod tests {
name: "mem_usage".to_string(),
}],
})),
..Default::default()
};
let alter_request = alter_expr_to_request(1, expr).unwrap();

View File

@@ -219,7 +219,7 @@ mod tests {
.iter()
.find(|c| c.name == "host")
.unwrap()
.datatype
.data_type
)
.unwrap()
)
@@ -233,7 +233,7 @@ mod tests {
.iter()
.find(|c| c.name == "cpu")
.unwrap()
.datatype
.data_type
)
.unwrap()
)
@@ -247,7 +247,7 @@ mod tests {
.iter()
.find(|c| c.name == "memory")
.unwrap()
.datatype
.data_type
)
.unwrap()
)
@@ -261,7 +261,7 @@ mod tests {
.iter()
.find(|c| c.name == "time")
.unwrap()
.datatype
.data_type
)
.unwrap()
)
@@ -275,7 +275,7 @@ mod tests {
.iter()
.find(|c| c.name == "interval")
.unwrap()
.datatype
.data_type
)
.unwrap()
)
@@ -289,7 +289,7 @@ mod tests {
.iter()
.find(|c| c.name == "ts")
.unwrap()
.datatype
.data_type
)
.unwrap()
)
@@ -316,46 +316,40 @@ mod tests {
assert_eq!(4, add_columns.add_columns.len());
let host_column = &add_columns.add_columns[0];
assert!(host_column.is_key);
assert_eq!(
ConcreteDataType::string_datatype(),
ConcreteDataType::from(
ColumnDataTypeWrapper::try_new(host_column.column_def.as_ref().unwrap().datatype)
ColumnDataTypeWrapper::try_new(host_column.column_def.as_ref().unwrap().data_type)
.unwrap()
)
);
let memory_column = &add_columns.add_columns[1];
assert!(!memory_column.is_key);
assert_eq!(
ConcreteDataType::float64_datatype(),
ConcreteDataType::from(
ColumnDataTypeWrapper::try_new(memory_column.column_def.as_ref().unwrap().datatype)
.unwrap()
ColumnDataTypeWrapper::try_new(
memory_column.column_def.as_ref().unwrap().data_type
)
.unwrap()
)
);
let time_column = &add_columns.add_columns[2];
assert!(!time_column.is_key);
assert_eq!(
ConcreteDataType::time_datatype(TimeUnit::Millisecond),
ConcreteDataType::from(
ColumnDataTypeWrapper::try_new(time_column.column_def.as_ref().unwrap().datatype)
ColumnDataTypeWrapper::try_new(time_column.column_def.as_ref().unwrap().data_type)
.unwrap()
)
);
let interval_column = &add_columns.add_columns[3];
assert!(!interval_column.is_key);
assert_eq!(
ConcreteDataType::interval_datatype(IntervalUnit::MonthDayNano),
ConcreteDataType::from(
ColumnDataTypeWrapper::try_new(
interval_column.column_def.as_ref().unwrap().datatype
interval_column.column_def.as_ref().unwrap().data_type
)
.unwrap()
)

View File

@@ -116,9 +116,10 @@ pub fn build_create_table_expr(
let column_def = ColumnDef {
name: column_name.to_string(),
datatype,
data_type: datatype,
is_nullable,
default_constraint: vec![],
semantic_type,
};
column_defs.push(column_def);
}
@@ -154,16 +155,15 @@ pub fn extract_new_columns(
.into_iter()
.filter(|expr| schema.column_schema_by_name(expr.column_name).is_none())
.map(|expr| {
let is_key = expr.semantic_type == SemanticType::Tag as i32;
let column_def = Some(ColumnDef {
name: expr.column_name.to_string(),
datatype: expr.datatype,
data_type: expr.datatype,
is_nullable: true,
default_constraint: vec![],
semantic_type: expr.semantic_type,
});
AddColumn {
column_def,
is_key,
location: None,
}
})