mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-10-16 08:52:30 +00:00
fix(json2): support settings in ALTER TABLE ADD COLUMN (#9472)
* fix(json2): support settings in ALTER TABLE ADD COLUMN Signed-off-by: fys <fengys1996@gmail.com> * refactor(sql): reuse Column for ADD COLUMN definitions Signed-off-by: fys <fengys1996@gmail.com> * chore: better method name * refactor(sql): share column parsing between CREATE TABLE and ADD COLUMN Signed-off-by: fys <fengys1996@gmail.com> * chore: simplify tests Signed-off-by: fys <fengys1996@gmail.com> * fix(sql): accept trailing commas in ALTER TABLE ADD COLUMN Signed-off-by: fys <fengys1996@gmail.com> * fix(sql): preserve ALTER TABLE ADD COLUMN compatibility Signed-off-by: fys <fengys1996@gmail.com> --------- Signed-off-by: fys <fengys1996@gmail.com>
This commit is contained in:
@@ -68,8 +68,8 @@ use sql::statements::create::{
|
||||
CreateView, TableConstraint,
|
||||
};
|
||||
use sql::statements::{
|
||||
OptionMap, column_to_schema, concrete_data_type_to_sql_data_type,
|
||||
sql_column_def_to_grpc_column_def, sql_data_type_to_concrete_data_type, value_to_sql_value,
|
||||
OptionMap, column_to_schema, concrete_data_type_to_sql_data_type, sql_col_to_grpc_col_def,
|
||||
sql_data_type_to_concrete_data_type, value_to_sql_value,
|
||||
};
|
||||
use sql::util::extract_tables_from_query;
|
||||
use store_api::mito_engine_options::{COMPACTION_OVERRIDE, COMPACTION_TYPE};
|
||||
@@ -828,12 +828,10 @@ pub(crate) fn to_alter_table_expr(
|
||||
add_columns: add_columns
|
||||
.into_iter()
|
||||
.map(|add_column| {
|
||||
let column_def = sql_column_def_to_grpc_column_def(
|
||||
&add_column.column_def,
|
||||
Some(&query_ctx.timezone()),
|
||||
)
|
||||
.map_err(BoxedError::new)
|
||||
.context(ExternalSnafu)?;
|
||||
let column_def =
|
||||
sql_col_to_grpc_col_def(&add_column.column, Some(&query_ctx.timezone()))
|
||||
.map_err(BoxedError::new)
|
||||
.context(ExternalSnafu)?;
|
||||
if is_interval_type(&column_def.data_type()) {
|
||||
return NotSupportedSnafu {
|
||||
feat: "Add column with interval type",
|
||||
@@ -1225,6 +1223,32 @@ mod tests {
|
||||
assert!(is_json2_extension_type(&schema.arrow_schema().fields()[0]));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_to_alter_add_json2_column_preserves_settings() {
|
||||
let sql = "ALTER TABLE monitor ADD COLUMN payload JSON2(max_auto_expanded_paths = 0, service STRING, nested.value BIGINT)";
|
||||
let stmt =
|
||||
ParserContext::create_with_dialect(sql, &GreptimeDbDialect {}, ParseOptions::default())
|
||||
.unwrap()
|
||||
.pop()
|
||||
.unwrap();
|
||||
let Statement::AlterTable(alter_table) = stmt else {
|
||||
unreachable!()
|
||||
};
|
||||
let expr = to_alter_table_expr(alter_table, &QueryContext::arc()).unwrap();
|
||||
let AlterTableKind::AddColumns(AddColumns { add_columns, .. }) = expr.kind.unwrap() else {
|
||||
unreachable!()
|
||||
};
|
||||
let column_schema =
|
||||
try_as_column_schema(add_columns[0].column_def.as_ref().unwrap()).unwrap();
|
||||
let metadata: datatypes::extension::json::JsonMetadata =
|
||||
serde_json::from_str(&column_schema.metadata()["ARROW:extension:metadata"]).unwrap();
|
||||
let settings = metadata.json_settings();
|
||||
assert_eq!(Some(0), settings.max_auto_expanded_paths());
|
||||
assert_eq!(2, settings.type_hints().len());
|
||||
assert_eq!(vec!["service"], settings.type_hints()[0].path);
|
||||
assert_eq!(vec!["nested", "value"], settings.type_hints()[1].path);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_create_flow_tql_expr() {
|
||||
let sql = r#"
|
||||
|
||||
Reference in New Issue
Block a user