mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-10-25 21:32:28 +00:00
feat(json2): support altering JSON2 settings (#9029)
* feat(sql): support alter syntax for JSON2 columns Signed-off-by: fys <fengys1996@gmail.com> * fix(json2): preserve rows on type hint mismatch during compaction * refactor(json2): simplify alter settings handling * fix(json2): preserve coerced values during compaction * chore: remove unnecessary clone * chor: reduce memory allocations * fix: cargo clippy * chore: update greptime-proto to main branch * refactor(datatypes): unify string handling with other JSON type hints * fix: cr --------- Signed-off-by: fys <fengys1996@gmail.com>
This commit is contained in:
@@ -24,21 +24,23 @@ use api::v1::{
|
||||
SkippingIndexType as PbSkippingIndexType, column_def,
|
||||
};
|
||||
use common_query::AddColumnLocation;
|
||||
use datatypes::json::{JsonSettings, JsonTypeHint};
|
||||
use datatypes::prelude::ConcreteDataType;
|
||||
use datatypes::schema::{ColumnSchema, FulltextOptions, Schema, SkippingIndexOptions};
|
||||
use snafu::{OptionExt, ResultExt, ensure};
|
||||
use store_api::region_request::{SetRegionOption, UnsetRegionOption};
|
||||
use table::metadata::{TableId, TableMeta};
|
||||
use table::requests::{
|
||||
AddColumnRequest, AlterKind, AlterTableRequest, AnnotationFamily, ModifyColumnTypeRequest,
|
||||
SetDefaultRequest, SetIndexOption, UnsetIndexOption,
|
||||
SetDefaultRequest, SetIndexOption, SetJsonSettingsRequest, UnsetIndexOption,
|
||||
};
|
||||
|
||||
use crate::error::{
|
||||
self, ColumnNotFoundSnafu, InvalidColumnDefSnafu, InvalidIndexOptionSnafu,
|
||||
InvalidSetFulltextOptionRequestSnafu, InvalidSetSkippingIndexOptionRequestSnafu,
|
||||
InvalidSetTableOptionRequestSnafu, InvalidUnsetTableOptionRequestSnafu,
|
||||
MissingAlterIndexOptionSnafu, MissingFieldSnafu, MissingTableMetaSnafu,
|
||||
MissingTimestampColumnSnafu, Result, UnknownLocationTypeSnafu,
|
||||
InvalidJsonSettingsSnafu, InvalidSetFulltextOptionRequestSnafu,
|
||||
InvalidSetSkippingIndexOptionRequestSnafu, InvalidSetTableOptionRequestSnafu,
|
||||
InvalidUnsetTableOptionRequestSnafu, MissingAlterIndexOptionSnafu, MissingFieldSnafu,
|
||||
MissingTableMetaSnafu, MissingTimestampColumnSnafu, Result, UnknownLocationTypeSnafu,
|
||||
};
|
||||
|
||||
const LOCATION_TYPE_FIRST: i32 = LocationType::First as i32;
|
||||
@@ -59,6 +61,34 @@ fn annotation_family_of_keys<'a>(
|
||||
})
|
||||
}
|
||||
|
||||
fn json_settings_from_proto(settings: api::v1::JsonSettings) -> Result<JsonSettings> {
|
||||
let type_hints = settings
|
||||
.type_hints
|
||||
.into_iter()
|
||||
.map(|hint| {
|
||||
let data_type = ConcreteDataType::from(
|
||||
ColumnDataTypeWrapper::try_new(hint.data_type, hint.datatype_extension)
|
||||
.context(error::ColumnDataTypeSnafu)?,
|
||||
);
|
||||
|
||||
Ok(JsonTypeHint {
|
||||
path: hint.path,
|
||||
data_type,
|
||||
// Index configuration is not supported yet, so this is temporarily
|
||||
// hardcoded to false.
|
||||
inverted_index: false,
|
||||
})
|
||||
})
|
||||
.collect::<Result<Vec<_>>>()?;
|
||||
|
||||
JsonSettings::try_new(type_hints, settings.max_auto_expanded_paths).map_err(|err| {
|
||||
InvalidJsonSettingsSnafu {
|
||||
err: err.to_string(),
|
||||
}
|
||||
.build()
|
||||
})
|
||||
}
|
||||
|
||||
/// Returns the annotation family when `kind` is a SET/UNSET whose keys all
|
||||
/// belong to one family — the alters that only rewrite table metadata and skip
|
||||
/// region dispatch. A mixed batch is an error; never interpret it as "not an
|
||||
@@ -189,6 +219,17 @@ pub fn alter_expr_to_request(
|
||||
columns: modify_column_type_requests,
|
||||
}
|
||||
}
|
||||
Kind::SetJsonSettings(set_json_settings) => {
|
||||
let settings = set_json_settings
|
||||
.settings
|
||||
.context(MissingFieldSnafu { field: "settings" })?;
|
||||
AlterKind::SetJsonSettings {
|
||||
request: SetJsonSettingsRequest {
|
||||
column_name: set_json_settings.column_name,
|
||||
settings: json_settings_from_proto(settings)?,
|
||||
},
|
||||
}
|
||||
}
|
||||
Kind::DropColumns(DropColumns { drop_columns }) => AlterKind::DropColumns {
|
||||
names: drop_columns.into_iter().map(|c| c.name).collect(),
|
||||
},
|
||||
|
||||
@@ -73,6 +73,13 @@ pub enum Error {
|
||||
source: api::error::Error,
|
||||
},
|
||||
|
||||
#[snafu(display("Invalid JSON settings: {}", err))]
|
||||
InvalidJsonSettings {
|
||||
err: String,
|
||||
#[snafu(implicit)]
|
||||
location: Location,
|
||||
},
|
||||
|
||||
#[snafu(display("Unknown location type: {}", location_type))]
|
||||
UnknownLocationType {
|
||||
location_type: i32,
|
||||
@@ -188,6 +195,7 @@ impl ErrorExt for Error {
|
||||
| Error::MissingTimestampColumn { .. } => StatusCode::InvalidArguments,
|
||||
Error::MissingField { .. } => StatusCode::InvalidArguments,
|
||||
Error::InvalidColumnDef { source, .. } => source.status_code(),
|
||||
Error::InvalidJsonSettings { .. } => StatusCode::InvalidArguments,
|
||||
Error::UnknownLocationType { .. } => StatusCode::InvalidArguments,
|
||||
|
||||
Error::UnknownColumnDataType { .. } | Error::InvalidFulltextIndexColumnType { .. } => {
|
||||
|
||||
Reference in New Issue
Block a user