From 28dc483f7b71b09f3b26d20da3e7bd1777c4e36d Mon Sep 17 00:00:00 2001 From: Dennis Zhuang Date: Fri, 29 Dec 2023 16:12:38 +0800 Subject: [PATCH] feat: improve information_schema.columns --- src/catalog/src/information_schema/columns.rs | 45 ++++- .../src/information_schema/table_names.rs | 1 + src/datatypes/src/schema/column_schema.rs | 11 +- .../common/system/information_schema.result | 162 +++++++++--------- 4 files changed, 134 insertions(+), 85 deletions(-) diff --git a/src/catalog/src/information_schema/columns.rs b/src/catalog/src/information_schema/columns.rs index 53f338783ad3..27d4921928e8 100644 --- a/src/catalog/src/information_schema/columns.rs +++ b/src/catalog/src/information_schema/columns.rs @@ -51,6 +51,10 @@ const TABLE_NAME: &str = "table_name"; const COLUMN_NAME: &str = "column_name"; const DATA_TYPE: &str = "data_type"; const SEMANTIC_TYPE: &str = "semantic_type"; +const COLUMN_DEFAULT: &str = "column_default"; +const IS_NULLABLE: &str = "is_nullable"; +const COLUMN_TYPE: &str = "column_type"; +const COLUMN_COMMENT: &str = "column_comment"; impl InformationSchemaColumns { pub(super) fn new(catalog_name: String, catalog_manager: Weak) -> Self { @@ -69,6 +73,10 @@ impl InformationSchemaColumns { ColumnSchema::new(COLUMN_NAME, ConcreteDataType::string_datatype(), false), ColumnSchema::new(DATA_TYPE, ConcreteDataType::string_datatype(), false), ColumnSchema::new(SEMANTIC_TYPE, ConcreteDataType::string_datatype(), false), + ColumnSchema::new(COLUMN_DEFAULT, ConcreteDataType::string_datatype(), true), + ColumnSchema::new(IS_NULLABLE, ConcreteDataType::string_datatype(), false), + ColumnSchema::new(COLUMN_TYPE, ConcreteDataType::string_datatype(), false), + ColumnSchema::new(COLUMN_COMMENT, ConcreteDataType::string_datatype(), true), ])) } @@ -126,6 +134,11 @@ struct InformationSchemaColumnsBuilder { column_names: StringVectorBuilder, data_types: StringVectorBuilder, semantic_types: StringVectorBuilder, + + column_defaults: StringVectorBuilder, + is_nullables: StringVectorBuilder, + column_types: StringVectorBuilder, + column_comments: StringVectorBuilder, } impl InformationSchemaColumnsBuilder { @@ -144,6 +157,10 @@ impl InformationSchemaColumnsBuilder { column_names: StringVectorBuilder::with_capacity(42), data_types: StringVectorBuilder::with_capacity(42), semantic_types: StringVectorBuilder::with_capacity(42), + column_defaults: StringVectorBuilder::with_capacity(42), + is_nullables: StringVectorBuilder::with_capacity(42), + column_types: StringVectorBuilder::with_capacity(42), + column_comments: StringVectorBuilder::with_capacity(42), } } @@ -187,9 +204,8 @@ impl InformationSchemaColumnsBuilder { &catalog_name, &schema_name, &table_name, - &column.name, - &column.data_type.name(), semantic_type, + column, ); } } else { @@ -206,16 +222,31 @@ impl InformationSchemaColumnsBuilder { catalog_name: &str, schema_name: &str, table_name: &str, - column_name: &str, - data_type: &str, semantic_type: &str, + column_schema: &ColumnSchema, ) { + let data_type = &column_schema.data_type.name(); + self.catalog_names.push(Some(catalog_name)); self.schema_names.push(Some(schema_name)); self.table_names.push(Some(table_name)); - self.column_names.push(Some(column_name)); + self.column_names.push(Some(&column_schema.name)); self.data_types.push(Some(data_type)); self.semantic_types.push(Some(semantic_type)); + self.column_defaults.push( + column_schema + .default_constraint() + .map(|s| format!("{}", s)) + .as_deref(), + ); + if column_schema.is_nullable() { + self.is_nullables.push(Some("Yes")); + } else { + self.is_nullables.push(Some("No")); + } + self.column_types.push(Some(data_type)); + self.column_comments + .push(column_schema.column_comment().map(|x| x.as_ref())); } fn finish(&mut self) -> Result { @@ -226,6 +257,10 @@ impl InformationSchemaColumnsBuilder { Arc::new(self.column_names.finish()), Arc::new(self.data_types.finish()), Arc::new(self.semantic_types.finish()), + Arc::new(self.column_defaults.finish()), + Arc::new(self.is_nullables.finish()), + Arc::new(self.column_types.finish()), + Arc::new(self.column_comments.finish()), ]; RecordBatch::new(self.schema.clone(), columns).context(CreateRecordBatchSnafu) diff --git a/src/catalog/src/information_schema/table_names.rs b/src/catalog/src/information_schema/table_names.rs index 996a2e035f48..73ef00b81bd3 100644 --- a/src/catalog/src/information_schema/table_names.rs +++ b/src/catalog/src/information_schema/table_names.rs @@ -25,3 +25,4 @@ pub const COLLATIONS: &str = "collations"; pub const COLLATION_CHARACTER_SET_APPLICABILITY: &str = "collation_character_set_applicability"; pub const CHECK_CONSTRAINTS: &str = "check_constraints"; pub const EVENTS: &str = "events"; +pub const SCHEMATA: &str = "schemata"; diff --git a/src/datatypes/src/schema/column_schema.rs b/src/datatypes/src/schema/column_schema.rs index 04f715fbc1f1..17c39ee11bd9 100644 --- a/src/datatypes/src/schema/column_schema.rs +++ b/src/datatypes/src/schema/column_schema.rs @@ -109,6 +109,11 @@ impl ColumnSchema { &mut self.metadata } + /// Retrieve the column comment + pub fn column_comment(&self) -> Option<&String> { + self.metadata.get(COMMENT_KEY) + } + pub fn with_time_index(mut self, is_time_index: bool) -> Self { self.is_time_index = is_time_index; if is_time_index { @@ -315,12 +320,16 @@ mod tests { #[test] fn test_column_schema_with_metadata() { - let metadata = Metadata::from([("k1".to_string(), "v1".to_string())]); + let metadata = Metadata::from([ + ("k1".to_string(), "v1".to_string()), + (COMMENT_KEY.to_string(), "test comment".to_string()), + ]); let column_schema = ColumnSchema::new("test", ConcreteDataType::int32_datatype(), true) .with_metadata(metadata) .with_default_constraint(Some(ColumnDefaultConstraint::null_value())) .unwrap(); assert_eq!("v1", column_schema.metadata().get("k1").unwrap()); + assert_eq!("test comment", column_schema.column_comment().unwrap()); assert!(column_schema .metadata() .get(DEFAULT_CONSTRAINT_KEY) diff --git a/tests/cases/standalone/common/system/information_schema.result b/tests/cases/standalone/common/system/information_schema.result index c3949ca644ba..5532d5a1d171 100644 --- a/tests/cases/standalone/common/system/information_schema.result +++ b/tests/cases/standalone/common/system/information_schema.result @@ -28,85 +28,89 @@ order by table_schema, table_name; select * from information_schema.columns order by table_schema, table_name; -+---------------+--------------------+---------------------------------------+----------------------+-----------+---------------+ -| table_catalog | table_schema | table_name | column_name | data_type | semantic_type | -+---------------+--------------------+---------------------------------------+----------------------+-----------+---------------+ -| greptime | information_schema | build_info | git_branch | String | FIELD | -| greptime | information_schema | build_info | git_commit | String | FIELD | -| greptime | information_schema | build_info | git_commit_short | String | FIELD | -| greptime | information_schema | build_info | git_dirty | String | FIELD | -| greptime | information_schema | build_info | pkg_version | String | FIELD | -| greptime | information_schema | character_sets | maxlen | Int64 | FIELD | -| greptime | information_schema | character_sets | character_set_name | String | FIELD | -| greptime | information_schema | character_sets | default_collate_name | String | FIELD | -| greptime | information_schema | character_sets | description | String | FIELD | -| greptime | information_schema | check_constraints | check_clause | String | FIELD | -| greptime | information_schema | check_constraints | constraint_name | String | FIELD | -| greptime | information_schema | check_constraints | constraint_schema | String | FIELD | -| greptime | information_schema | check_constraints | constraint_catalog | String | FIELD | -| greptime | information_schema | collation_character_set_applicability | character_set_name | String | FIELD | -| greptime | information_schema | collation_character_set_applicability | collation_name | String | FIELD | -| greptime | information_schema | collations | collation_name | String | FIELD | -| greptime | information_schema | collations | character_set_name | String | FIELD | -| greptime | information_schema | collations | id | Int64 | FIELD | -| greptime | information_schema | collations | is_default | String | FIELD | -| greptime | information_schema | collations | is_compiled | String | FIELD | -| greptime | information_schema | collations | sortlen | Int64 | FIELD | -| greptime | information_schema | column_privileges | table_catalog | String | FIELD | -| greptime | information_schema | column_privileges | grantee | String | FIELD | -| greptime | information_schema | column_privileges | privilege_type | String | FIELD | -| greptime | information_schema | column_privileges | is_grantable | String | FIELD | -| greptime | information_schema | column_privileges | column_name | String | FIELD | -| greptime | information_schema | column_privileges | table_name | String | FIELD | -| greptime | information_schema | column_privileges | table_schema | String | FIELD | -| greptime | information_schema | column_statistics | schema_name | String | FIELD | -| greptime | information_schema | column_statistics | table_name | String | FIELD | -| greptime | information_schema | column_statistics | column_name | String | FIELD | -| greptime | information_schema | column_statistics | histogram | String | FIELD | -| greptime | information_schema | columns | table_catalog | String | FIELD | -| greptime | information_schema | columns | table_schema | String | FIELD | -| greptime | information_schema | columns | semantic_type | String | FIELD | -| greptime | information_schema | columns | data_type | String | FIELD | -| greptime | information_schema | columns | column_name | String | FIELD | -| greptime | information_schema | columns | table_name | String | FIELD | -| greptime | information_schema | engines | savepoints | String | FIELD | -| greptime | information_schema | engines | xa | String | FIELD | -| greptime | information_schema | engines | transactions | String | FIELD | -| greptime | information_schema | engines | comment | String | FIELD | -| greptime | information_schema | engines | support | String | FIELD | -| greptime | information_schema | engines | engine | String | FIELD | -| greptime | information_schema | events | sql_mode | String | FIELD | -| greptime | information_schema | events | interval_value | Int64 | FIELD | -| greptime | information_schema | events | database_collation | String | FIELD | -| greptime | information_schema | events | collation_connection | String | FIELD | -| greptime | information_schema | events | character_set_client | String | FIELD | -| greptime | information_schema | events | originator | Int64 | FIELD | -| greptime | information_schema | events | event_catalog | String | FIELD | -| greptime | information_schema | events | event_schema | String | FIELD | -| greptime | information_schema | events | event_name | String | FIELD | -| greptime | information_schema | events | definer | String | FIELD | -| greptime | information_schema | events | time_zone | String | FIELD | -| greptime | information_schema | events | event_body | String | FIELD | -| greptime | information_schema | events | event_definition | String | FIELD | -| greptime | information_schema | events | event_type | String | FIELD | -| greptime | information_schema | events | execute_at | DateTime | FIELD | -| greptime | information_schema | events | event_comment | String | FIELD | -| greptime | information_schema | events | interval_field | String | FIELD | -| greptime | information_schema | events | last_executed | DateTime | FIELD | -| greptime | information_schema | events | starts | DateTime | FIELD | -| greptime | information_schema | events | ends | DateTime | FIELD | -| greptime | information_schema | events | status | String | FIELD | -| greptime | information_schema | events | on_completion | String | FIELD | -| greptime | information_schema | events | created | DateTime | FIELD | -| greptime | information_schema | events | last_altered | DateTime | FIELD | -| greptime | information_schema | tables | table_catalog | String | FIELD | -| greptime | information_schema | tables | table_schema | String | FIELD | -| greptime | information_schema | tables | table_name | String | FIELD | -| greptime | information_schema | tables | table_type | String | FIELD | -| greptime | information_schema | tables | table_id | UInt32 | FIELD | -| greptime | information_schema | tables | engine | String | FIELD | -| greptime | public | numbers | number | UInt32 | TAG | -+---------------+--------------------+---------------------------------------+----------------------+-----------+---------------+ ++---------------+--------------------+---------------------------------------+----------------------+-----------+---------------+----------------+-------------+-------------+----------------+ +| table_catalog | table_schema | table_name | column_name | data_type | semantic_type | column_default | is_nullable | column_type | column_comment | ++---------------+--------------------+---------------------------------------+----------------------+-----------+---------------+----------------+-------------+-------------+----------------+ +| greptime | information_schema | build_info | pkg_version | String | FIELD | | No | String | | +| greptime | information_schema | build_info | git_branch | String | FIELD | | No | String | | +| greptime | information_schema | build_info | git_commit | String | FIELD | | No | String | | +| greptime | information_schema | build_info | git_commit_short | String | FIELD | | No | String | | +| greptime | information_schema | build_info | git_dirty | String | FIELD | | No | String | | +| greptime | information_schema | character_sets | description | String | FIELD | | No | String | | +| greptime | information_schema | character_sets | maxlen | Int64 | FIELD | | No | Int64 | | +| greptime | information_schema | character_sets | default_collate_name | String | FIELD | | No | String | | +| greptime | information_schema | character_sets | character_set_name | String | FIELD | | No | String | | +| greptime | information_schema | check_constraints | constraint_schema | String | FIELD | | No | String | | +| greptime | information_schema | check_constraints | check_clause | String | FIELD | | No | String | | +| greptime | information_schema | check_constraints | constraint_name | String | FIELD | | No | String | | +| greptime | information_schema | check_constraints | constraint_catalog | String | FIELD | | No | String | | +| greptime | information_schema | collation_character_set_applicability | collation_name | String | FIELD | | No | String | | +| greptime | information_schema | collation_character_set_applicability | character_set_name | String | FIELD | | No | String | | +| greptime | information_schema | collations | collation_name | String | FIELD | | No | String | | +| greptime | information_schema | collations | sortlen | Int64 | FIELD | | No | Int64 | | +| greptime | information_schema | collations | is_compiled | String | FIELD | | No | String | | +| greptime | information_schema | collations | is_default | String | FIELD | | No | String | | +| greptime | information_schema | collations | id | Int64 | FIELD | | No | Int64 | | +| greptime | information_schema | collations | character_set_name | String | FIELD | | No | String | | +| greptime | information_schema | column_privileges | is_grantable | String | FIELD | | No | String | | +| greptime | information_schema | column_privileges | grantee | String | FIELD | | No | String | | +| greptime | information_schema | column_privileges | table_catalog | String | FIELD | | No | String | | +| greptime | information_schema | column_privileges | table_schema | String | FIELD | | No | String | | +| greptime | information_schema | column_privileges | table_name | String | FIELD | | No | String | | +| greptime | information_schema | column_privileges | column_name | String | FIELD | | No | String | | +| greptime | information_schema | column_privileges | privilege_type | String | FIELD | | No | String | | +| greptime | information_schema | column_statistics | table_name | String | FIELD | | No | String | | +| greptime | information_schema | column_statistics | schema_name | String | FIELD | | No | String | | +| greptime | information_schema | column_statistics | column_name | String | FIELD | | No | String | | +| greptime | information_schema | column_statistics | histogram | String | FIELD | | No | String | | +| greptime | information_schema | columns | table_catalog | String | FIELD | | No | String | | +| greptime | information_schema | columns | column_comment | String | FIELD | | Yes | String | | +| greptime | information_schema | columns | column_type | String | FIELD | | No | String | | +| greptime | information_schema | columns | is_nullable | String | FIELD | | No | String | | +| greptime | information_schema | columns | column_default | String | FIELD | | Yes | String | | +| greptime | information_schema | columns | semantic_type | String | FIELD | | No | String | | +| greptime | information_schema | columns | data_type | String | FIELD | | No | String | | +| greptime | information_schema | columns | column_name | String | FIELD | | No | String | | +| greptime | information_schema | columns | table_name | String | FIELD | | No | String | | +| greptime | information_schema | columns | table_schema | String | FIELD | | No | String | | +| greptime | information_schema | engines | transactions | String | FIELD | | No | String | | +| greptime | information_schema | engines | support | String | FIELD | | No | String | | +| greptime | information_schema | engines | savepoints | String | FIELD | | No | String | | +| greptime | information_schema | engines | xa | String | FIELD | | No | String | | +| greptime | information_schema | engines | engine | String | FIELD | | No | String | | +| greptime | information_schema | engines | comment | String | FIELD | | No | String | | +| greptime | information_schema | events | created | DateTime | FIELD | | No | DateTime | | +| greptime | information_schema | events | interval_value | Int64 | FIELD | | No | Int64 | | +| greptime | information_schema | events | database_collation | String | FIELD | | No | String | | +| greptime | information_schema | events | collation_connection | String | FIELD | | No | String | | +| greptime | information_schema | events | character_set_client | String | FIELD | | No | String | | +| greptime | information_schema | events | originator | Int64 | FIELD | | No | Int64 | | +| greptime | information_schema | events | event_catalog | String | FIELD | | No | String | | +| greptime | information_schema | events | event_schema | String | FIELD | | No | String | | +| greptime | information_schema | events | event_name | String | FIELD | | No | String | | +| greptime | information_schema | events | definer | String | FIELD | | No | String | | +| greptime | information_schema | events | time_zone | String | FIELD | | No | String | | +| greptime | information_schema | events | event_body | String | FIELD | | No | String | | +| greptime | information_schema | events | event_definition | String | FIELD | | No | String | | +| greptime | information_schema | events | event_type | String | FIELD | | No | String | | +| greptime | information_schema | events | execute_at | DateTime | FIELD | | No | DateTime | | +| greptime | information_schema | events | event_comment | String | FIELD | | No | String | | +| greptime | information_schema | events | interval_field | String | FIELD | | No | String | | +| greptime | information_schema | events | sql_mode | String | FIELD | | No | String | | +| greptime | information_schema | events | starts | DateTime | FIELD | | No | DateTime | | +| greptime | information_schema | events | ends | DateTime | FIELD | | No | DateTime | | +| greptime | information_schema | events | status | String | FIELD | | No | String | | +| greptime | information_schema | events | on_completion | String | FIELD | | No | String | | +| greptime | information_schema | events | last_executed | DateTime | FIELD | | No | DateTime | | +| greptime | information_schema | events | last_altered | DateTime | FIELD | | No | DateTime | | +| greptime | information_schema | tables | table_schema | String | FIELD | | No | String | | +| greptime | information_schema | tables | table_catalog | String | FIELD | | No | String | | +| greptime | information_schema | tables | table_name | String | FIELD | | No | String | | +| greptime | information_schema | tables | table_type | String | FIELD | | No | String | | +| greptime | information_schema | tables | table_id | UInt32 | FIELD | | Yes | UInt32 | | +| greptime | information_schema | tables | engine | String | FIELD | | Yes | String | | +| greptime | public | numbers | number | UInt32 | TAG | | No | UInt32 | | ++---------------+--------------------+---------------------------------------+----------------------+-----------+---------------+----------------+-------------+-------------+----------------+ create database my_db;