diff --git a/docs/rfcs/2026-05-28-table-semantic-layer.md b/docs/rfcs/2026-05-28-table-semantic-layer.md index cb5f6e84dc4..79764ad80d2 100644 --- a/docs/rfcs/2026-05-28-table-semantic-layer.md +++ b/docs/rfcs/2026-05-28-table-semantic-layer.md @@ -70,6 +70,13 @@ concern, not query-time semantics). | `greptime.semantic.source_version` | Source protocol version, e.g. Prometheus remote write `1.0` / `2.0` | | `greptime.semantic.pipeline` | `greptime_trace_v1` (the signal-agnostic successor to `table_data_model`) | +**Information-schema tables** carry `greptime.semantic.table_scope`: `catalog` +means the provider filters every query to its construction catalog; `global` +means catalog-independent or shared data, including compatibility stubs. The +scope is declared at registration and appears as `table_scope` in `semantic_options`. +Enterprise authorization trusts only registered system-table metadata. Setting +this option on a user table does not change its permissions. + **Trace**: `greptime.semantic.trace.conventions` (the OTel `schema_url` the rows conform to, or `mixed` / `unknown` when not single-valued). **Metric** — v1 assumes one metric type per table, which is how both Prom RW and the post-v0.16 OTel ingestion path land data today; mixed-type tables are a follow-up. These are stamped for OTLP (which declares them on the wire and then discards them); Prometheus carries its type/unit in the name and gets identity only. diff --git a/src/catalog/src/kvbackend/manager.rs b/src/catalog/src/kvbackend/manager.rs index 2afc77c0d23..0beb2c0e1f5 100644 --- a/src/catalog/src/kvbackend/manager.rs +++ b/src/catalog/src/kvbackend/manager.rs @@ -94,6 +94,11 @@ pub struct KvBackendCatalogManager { pub(super) const CATALOG_CACHE_MAX_CAPACITY: u64 = 128; impl KvBackendCatalogManager { + /// Returns the registered system tables, excluding user-created metadata. + pub fn information_schema_provider(&self) -> &InformationSchemaProvider { + &self.system_catalog.information_schema_provider + } + pub fn view_info_cache(&self) -> Result { self.cache_registry.get().context(CacheNotFoundSnafu { name: "view_info_cache", diff --git a/src/catalog/src/system_schema.rs b/src/catalog/src/system_schema.rs index add91cc75f4..099b8832f40 100644 --- a/src/catalog/src/system_schema.rs +++ b/src/catalog/src/system_schema.rs @@ -33,9 +33,8 @@ use snafu::ResultExt; use store_api::data_source::DataSource; use store_api::storage::ScanRequest; use table::error::{SchemaConversionSnafu, TablesRecordBatchSnafu}; -use table::metadata::{ - FilterPushDownType, TableId, TableInfoBuilder, TableInfoRef, TableMetaBuilder, TableType, -}; +use table::metadata::{FilterPushDownType, TableId, TableInfoBuilder, TableMetaBuilder, TableType}; +use table::requests::TableOptions; use table::{Table, TableRef}; use crate::error::Result; @@ -71,33 +70,44 @@ trait SystemSchemaProviderInner { fn schema_name() -> &'static str; fn build_table(&self, name: &str) -> Option { self.system_table(name).map(|table| { - let table_info = Self::table_info(self.catalog_name().to_string(), &table); - let filter_pushdown = FilterPushDownType::Inexact; - let data_source = Arc::new(SystemTableDataSource::new(table)); - let table = Table::new(table_info, filter_pushdown, data_source); - Arc::new(table) + build_system_table( + self.catalog_name().to_string(), + Self::schema_name(), + table, + TableOptions::default(), + ) }) } fn system_table(&self, name: &str) -> Option; +} - fn table_info(catalog_name: String, table: &SystemTableRef) -> TableInfoRef { - let table_meta = TableMetaBuilder::empty() - .schema(table.schema()) - .primary_key_indices(vec![]) - .next_column_id(0) - .build() - .unwrap(); - let table_info = TableInfoBuilder::default() - .table_id(table.table_id()) - .name(table.table_name().to_string()) - .catalog_name(catalog_name) - .schema_name(Self::schema_name().to_string()) - .meta(table_meta) - .table_type(table.table_type()) - .build() - .unwrap(); - Arc::new(table_info) - } +fn build_system_table( + catalog_name: String, + schema_name: &str, + table: SystemTableRef, + options: TableOptions, +) -> TableRef { + let table_meta = TableMetaBuilder::empty() + .schema(table.schema()) + .primary_key_indices(vec![]) + .next_column_id(0) + .options(options) + .build() + .unwrap(); + let table_info = TableInfoBuilder::default() + .table_id(table.table_id()) + .name(table.table_name().to_string()) + .catalog_name(catalog_name) + .schema_name(schema_name.to_string()) + .meta(table_meta) + .table_type(table.table_type()) + .build() + .unwrap(); + Arc::new(Table::new( + Arc::new(table_info), + FilterPushDownType::Inexact, + Arc::new(SystemTableDataSource::new(table)), + )) } pub trait SystemTable { diff --git a/src/catalog/src/system_schema/information_schema.rs b/src/catalog/src/system_schema/information_schema.rs index 8c3f4bf0f5f..b2145df9cd3 100644 --- a/src/catalog/src/system_schema/information_schema.rs +++ b/src/catalog/src/system_schema/information_schema.rs @@ -38,7 +38,7 @@ mod views; #[cfg(all(test, feature = "enterprise"))] mod recycle_bin_test; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::sync::{Arc, Weak}; use common_catalog::consts::{self, DEFAULT_CATALOG_NAME, INFORMATION_SCHEMA_NAME}; @@ -63,15 +63,15 @@ use store_api::metric_engine_consts::{ }; use store_api::region_info::RegionInfoEntry; use store_api::sst_entry::{ManifestSstEntry, PuffinIndexMetaEntry, StorageSstEntry}; -use store_api::storage::{ScanRequest, TableId}; +use store_api::storage::ScanRequest; use table::TableRef; -use table::metadata::TableType; +use table::requests::{SEMANTIC_TABLE_SCOPE, TableOptions}; pub use table_names::*; use views::InformationSchemaViews; use self::columns::InformationSchemaColumns; use crate::CatalogManager; -use crate::error::{Error, Result}; +use crate::error::Error; use crate::process_manager::ProcessManagerRef; use crate::system_schema::information_schema::cluster_info::InformationSchemaClusterInfo; use crate::system_schema::information_schema::flow_statistics::InformationSchemaFlowStatistics; @@ -92,9 +92,7 @@ use crate::system_schema::information_schema::table_semantics::InformationSchema use crate::system_schema::information_schema::tables::InformationSchemaTables; use crate::system_schema::memory_table::MemoryTable; pub(crate) use crate::system_schema::predicate::Predicates; -use crate::system_schema::{ - SystemSchemaProvider, SystemSchemaProviderInner, SystemTable, SystemTableRef, -}; +use crate::system_schema::{SystemSchemaProvider, SystemTable, build_system_table}; const DENSE_PRIMARY_KEY_ENCODING: &str = "dense"; const SPARSE_PRIMARY_KEY_ENCODING: &str = "sparse"; @@ -134,7 +132,6 @@ lazy_static! { TABLE_PRIVILEGES, GLOBAL_STATUS, SESSION_STATUS, - PARTITIONS, PLUGINS, USER_PRIVILEGES, PROCESSLIST, @@ -163,12 +160,31 @@ pub struct MakeInformationTableRequest { pub kv_backend: KvBackendRef, } +/// The visibility guaranteed by an information-schema table provider. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum InformationSchemaTableScope { + /// Every query is filtered to the catalog supplied when constructing the provider. + Catalog, + /// The table contains catalog-independent or shared data, including compatibility stubs. + Global, +} + +impl InformationSchemaTableScope { + pub const fn as_str(self) -> &'static str { + match self { + Self::Catalog => "catalog", + Self::Global => "global", + } + } +} + /// A factory trait for making information schema tables. /// /// This trait allows for extensibility of the information schema by providing /// a way to dynamically create custom information schema tables. pub trait InformationSchemaTableFactory { - fn make_information_table(&self, req: MakeInformationTableRequest) -> SystemTableRef; + /// Creates a table whose scope is declared by its [`InformationTable`] implementation. + fn make_information_table(&self, req: MakeInformationTableRequest) -> InformationTableRef; } pub type InformationSchemaTableFactoryRef = Arc; @@ -192,15 +208,8 @@ impl SystemSchemaProvider for InformationSchemaProvider { } } -impl SystemSchemaProviderInner for InformationSchemaProvider { - fn catalog_name(&self) -> &str { - &self.catalog_name - } - fn schema_name() -> &'static str { - INFORMATION_SCHEMA_NAME - } - - fn system_table(&self, name: &str) -> Option { +impl InformationSchemaProvider { + fn information_table(&self, name: &str) -> Option { if let Some(factory) = self.extra_table_factories.get(name) { let req = MakeInformationTableRequest { catalog_name: self.catalog_name.clone(), @@ -357,142 +366,76 @@ impl InformationSchemaProvider { } fn build_tables(&mut self) { - let mut tables = HashMap::new(); + let mut table_names = HashSet::new(); // SECURITY NOTE: // Carefully consider the tables that may expose sensitive cluster configurations, // authentication details, and other critical information. // Only put these tables under `greptime` catalog to prevent info leak. if self.catalog_name == DEFAULT_CATALOG_NAME { - tables.insert( - BUILD_INFO.to_string(), - self.build_table(BUILD_INFO).unwrap(), - ); - tables.insert( - REGION_PEERS.to_string(), - self.build_table(REGION_PEERS).unwrap(), - ); - tables.insert( - CLUSTER_INFO.to_string(), - self.build_table(CLUSTER_INFO).unwrap(), - ); - tables.insert( - PROCEDURE_INFO.to_string(), - self.build_table(PROCEDURE_INFO).unwrap(), - ); - tables.insert( - REGION_STATISTICS.to_string(), - self.build_table(REGION_STATISTICS).unwrap(), - ); - tables.insert( - REGION_INFO.to_string(), - self.build_table(REGION_INFO).unwrap(), - ); - tables.insert( - SSTS_MANIFEST.to_string(), - self.build_table(SSTS_MANIFEST).unwrap(), - ); - tables.insert( - SSTS_STORAGE.to_string(), - self.build_table(SSTS_STORAGE).unwrap(), - ); - tables.insert( - SSTS_INDEX_META.to_string(), - self.build_table(SSTS_INDEX_META).unwrap(), - ); + table_names.extend([ + BUILD_INFO, + REGION_PEERS, + CLUSTER_INFO, + PROCEDURE_INFO, + REGION_STATISTICS, + REGION_INFO, + SSTS_MANIFEST, + SSTS_STORAGE, + SSTS_INDEX_META, + ]); } - tables.insert(TABLES.to_string(), self.build_table(TABLES).unwrap()); - tables.insert(VIEWS.to_string(), self.build_table(VIEWS).unwrap()); - tables.insert(SCHEMATA.to_string(), self.build_table(SCHEMATA).unwrap()); - tables.insert(COLUMNS.to_string(), self.build_table(COLUMNS).unwrap()); - tables.insert( - KEY_COLUMN_USAGE.to_string(), - self.build_table(KEY_COLUMN_USAGE).unwrap(), - ); - tables.insert( - TABLE_CONSTRAINTS.to_string(), - self.build_table(TABLE_CONSTRAINTS).unwrap(), - ); - tables.insert( - STATISTICS.to_string(), - self.build_table(STATISTICS).unwrap(), - ); - tables.insert(FLOWS.to_string(), self.build_table(FLOWS).unwrap()); - tables.insert( - FLOW_STATISTICS.to_string(), - self.build_table(FLOW_STATISTICS).unwrap(), - ); - #[cfg(feature = "enterprise")] - tables.insert( - RECYCLE_BIN.to_string(), - self.build_table(RECYCLE_BIN).unwrap(), - ); - tables.insert( - TABLE_SEMANTICS.to_string(), - self.build_table(TABLE_SEMANTICS).unwrap(), - ); - if let Some(process_list) = self.build_table(PROCESS_LIST) { - tables.insert(PROCESS_LIST.to_string(), process_list); + table_names.extend([ + TABLES, + VIEWS, + SCHEMATA, + COLUMNS, + KEY_COLUMN_USAGE, + TABLE_CONSTRAINTS, + STATISTICS, + FLOWS, + FLOW_STATISTICS, + #[cfg(feature = "enterprise")] + RECYCLE_BIN, + TABLE_SEMANTICS, + PARTITIONS, + ]); + if self.process_manager.is_some() { + table_names.insert(PROCESS_LIST); } - for name in self.extra_table_factories.keys() { - tables.insert(name.clone(), self.build_table(name).expect(name)); - } - // Add memory tables - for name in MEMORY_TABLES.iter() { - tables.insert((*name).to_string(), self.build_table(name).expect(name)); - } - self.tables = tables; + table_names.extend(MEMORY_TABLES.iter().copied()); + table_names.extend(self.extra_table_factories.keys().map(String::as_str)); + self.tables = table_names + .into_iter() + .map(|name| { + let table = self.information_table(name).expect(name); + let options = TableOptions { + extra_options: HashMap::from([( + SEMANTIC_TABLE_SCOPE.to_string(), + table.scope().as_str().to_string(), + )]), + ..Default::default() + }; + let table = build_system_table( + self.catalog_name.clone(), + INFORMATION_SCHEMA_NAME, + table, + options, + ); + (name.to_string(), table) + }) + .collect(); } } -pub trait InformationTable { - fn table_id(&self) -> TableId; - - fn table_name(&self) -> &'static str; - - fn schema(&self) -> SchemaRef; - - fn to_stream(&self, request: ScanRequest) -> Result; - - fn scan_plan(&self, _request: ScanRequest) -> Result>> { - Ok(None) - } - - fn table_type(&self) -> TableType { - TableType::Temporary - } +/// An information-schema table with an explicit visibility guarantee. +pub trait InformationTable: SystemTable { + /// Returns the visibility guaranteed by this table's query implementation. + fn scope(&self) -> InformationSchemaTableScope; } -// Provide compatibility for legacy `information_schema` code. -impl SystemTable for T -where - T: InformationTable, -{ - fn table_id(&self) -> TableId { - InformationTable::table_id(self) - } - - fn table_name(&self) -> &'static str { - InformationTable::table_name(self) - } - - fn schema(&self) -> SchemaRef { - InformationTable::schema(self) - } - - fn table_type(&self) -> TableType { - InformationTable::table_type(self) - } - - fn to_stream(&self, request: ScanRequest) -> Result { - InformationTable::to_stream(self, request) - } - - fn scan_plan(&self, request: ScanRequest) -> Result>> { - InformationTable::scan_plan(self, request) - } -} +pub type InformationTableRef = Arc; pub type InformationExtensionRef = Arc + Send + Sync>; @@ -597,9 +540,252 @@ impl InformationExtension for NoopInformationExtension { #[cfg(test)] mod tests { + use cache::{build_fundamental_cache_registry, with_default_composite_cache_registry}; + use common_meta::cache::{CacheRegistryBuilder, LayeredCacheRegistryBuilder}; + use common_meta::ddl::test_util::create_table::test_create_table_task; + use common_meta::key::schema_name::SchemaNameKey; + use common_meta::key::table_route::TableRouteValue; + use common_meta::kv_backend::memory::MemoryKvBackend; + use common_meta::kv_backend::txn::TxnService; + use common_meta::wal_provider::RegionWalOptions; + use datatypes::schema::Schema; + use futures_util::TryStreamExt; use store_api::region_info::RegionInfoEntry; + use store_api::storage::TableId; use super::*; + use crate::error::Result; + use crate::information_schema::NoopInformationExtension; + use crate::kvbackend::KvBackendCatalogManagerBuilder; + use crate::memory::MemoryCatalogManager; + use crate::process_manager::ProcessManager; + + struct ScopedFactory { + name: &'static str, + scope: InformationSchemaTableScope, + } + + impl InformationSchemaTableFactory for ScopedFactory { + fn make_information_table(&self, _req: MakeInformationTableRequest) -> InformationTableRef { + Arc::new(ScopedTable { + name: self.name, + scope: self.scope, + }) + } + } + + struct ScopedTable { + name: &'static str, + scope: InformationSchemaTableScope, + } + + impl InformationTable for ScopedTable { + fn scope(&self) -> InformationSchemaTableScope { + self.scope + } + } + + impl SystemTable for ScopedTable { + fn table_id(&self) -> TableId { + 999 + } + + fn table_name(&self) -> &'static str { + self.name + } + + fn schema(&self) -> SchemaRef { + Arc::new(Schema::new(vec![])) + } + + fn to_stream(&self, _request: ScanRequest) -> Result { + Ok(common_recordbatch::RecordBatches::empty().as_stream()) + } + } + + #[test] + fn every_registered_information_schema_table_has_scope() { + use InformationSchemaTableScope::{Catalog, Global}; + + let manager: Arc = MemoryCatalogManager::new(); + let backend = Arc::new(MemoryKvBackend::default()); + let factories: HashMap<_, InformationSchemaTableFactoryRef> = [ + ("future_catalog_table", Catalog), + ("future_global_table", Global), + (ENGINES, Catalog), + ] + .into_iter() + .map(|(name, scope)| { + ( + name.to_string(), + Arc::new(ScopedFactory { name, scope }) as _, + ) + }) + .collect(); + let catalog_tables = [ + TABLES, + VIEWS, + SCHEMATA, + COLUMNS, + KEY_COLUMN_USAGE, + TABLE_CONSTRAINTS, + STATISTICS, + FLOWS, + FLOW_STATISTICS, + TABLE_SEMANTICS, + PARTITIONS, + REGION_PEERS, + #[cfg(feature = "enterprise")] + RECYCLE_BIN, + "future_catalog_table", + ENGINES, + ]; + + for (catalog, with_process_manager) in [ + (DEFAULT_CATALOG_NAME, true), + (DEFAULT_CATALOG_NAME, false), + ("tenant", true), + ("tenant", false), + ] { + let provider = InformationSchemaProvider::new( + catalog.to_string(), + Arc::downgrade(&manager), + Arc::new(FlowMetadataManager::new(backend.clone())), + with_process_manager.then(|| Arc::new(ProcessManager::new(String::new(), None))), + backend.clone(), + ); + assert_eq!( + provider + .table(ENGINES) + .unwrap() + .table_info() + .meta + .options + .extra_options + .get(SEMANTIC_TABLE_SCOPE) + .map(String::as_str), + Some(Global.as_str()), + ); + // An extension replacing a built-in supplies the replacement table's scope. + let provider = provider.with_extra_table_factories(factories.clone()); + let expected_count = + 43 + usize::from(with_process_manager) + usize::from(cfg!(feature = "enterprise")) + - if catalog == DEFAULT_CATALOG_NAME { + 0 + } else { + 9 + }; + assert_eq!(provider.tables().len(), expected_count); + for (name, table) in provider.tables() { + let scope = if catalog_tables.contains(&name.as_str()) { + Catalog + } else { + Global + }; + assert_eq!( + table + .table_info() + .meta + .options + .extra_options + .get(SEMANTIC_TABLE_SCOPE) + .map(String::as_str), + Some(scope.as_str()), + "{catalog}.{name}" + ); + } + assert_eq!( + provider.table(REGION_PEERS).is_some(), + catalog == DEFAULT_CATALOG_NAME + ); + assert_eq!(provider.table(PROCESS_LIST).is_some(), with_process_manager); + if let Some(table) = provider.table(PROCESS_LIST) { + assert!(table.schema().column_schema_by_name("catalog").is_some()); + } + } + } + + #[tokio::test] + async fn newly_accessible_information_schema_tables_filter_catalogs() { + let backend = Arc::new(MemoryKvBackend::default()); + let caches = LayeredCacheRegistryBuilder::default() + .add_cache_registry(CacheRegistryBuilder::default().build()) + .add_cache_registry(build_fundamental_cache_registry(backend.clone())); + let manager = KvBackendCatalogManagerBuilder::new( + Arc::new(NoopInformationExtension), + backend.clone(), + Arc::new( + with_default_composite_cache_registry(caches) + .unwrap() + .build(), + ), + ) + .build(); + let metadata = manager.table_metadata_manager_ref(); + let flow_metadata = FlowMetadataManager::new(backend.clone()); + for (catalog, name, id) in [ + ("tenant_a", "visible_a", 1024), + ("tenant_b", "visible_b", 1025), + ] { + metadata + .schema_manager() + .create(SchemaNameKey::new(catalog, "public"), None, false) + .await + .unwrap(); + let mut info = test_create_table_task(name, id).table_info; + info.catalog_name = catalog.to_string(); + info.meta + .options + .extra_options + .insert(SEMANTIC_TABLE_SCOPE.to_string(), "catalog".to_string()); + metadata + .create_table_metadata( + info, + TableRouteValue::physical(vec![]), + RegionWalOptions::default(), + ) + .await + .unwrap(); + let (txn, _) = flow_metadata + .flow_name_manager() + .build_create_txn(catalog, name, id) + .unwrap(); + backend.txn(txn).await.unwrap(); + } + + for (catalog, visible, hidden) in [ + ("tenant_a", "visible_a", "visible_b"), + ("tenant_b", "visible_b", "visible_a"), + ] { + for name in [TABLE_SEMANTICS, STATISTICS, FLOW_STATISTICS] { + let table = manager + .table(catalog, INFORMATION_SCHEMA_NAME, name, None) + .await + .unwrap() + .unwrap(); + let batches = table + .scan_to_stream(ScanRequest::default()) + .await + .unwrap() + .try_collect::>() + .await + .unwrap(); + let output = batches + .iter() + .map(|batch| batch.pretty_print()) + .collect::>() + .join("\n"); + assert!(output.contains(visible), "{catalog}.{name}: {output}"); + assert!(!output.contains(hidden), "{catalog}.{name}: {output}"); + } + } + assert!( + !manager + .information_schema_provider() + .tables() + .contains_key("visible_a") + ); + } #[test] fn test_datanode_inspect_region_info_build_plan() { diff --git a/src/catalog/src/system_schema/information_schema/cluster_info.rs b/src/catalog/src/system_schema/information_schema/cluster_info.rs index 1ba1a55fb63..20ecba07d87 100644 --- a/src/catalog/src/system_schema/information_schema/cluster_info.rs +++ b/src/catalog/src/system_schema/information_schema/cluster_info.rs @@ -40,7 +40,10 @@ use store_api::storage::{ScanRequest, TableId}; use crate::CatalogManager; use crate::error::{CreateRecordBatchSnafu, InternalSnafu, Result}; -use crate::system_schema::information_schema::{CLUSTER_INFO, InformationTable, Predicates}; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{ + CLUSTER_INFO, InformationSchemaTableScope, InformationTable, Predicates, +}; use crate::system_schema::utils; const PEER_TYPE_FRONTEND: &str = "FRONTEND"; @@ -139,6 +142,12 @@ impl InformationSchemaClusterInfo { } impl InformationTable for InformationSchemaClusterInfo { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Global + } +} + +impl SystemTable for InformationSchemaClusterInfo { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_CLUSTER_INFO_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/columns.rs b/src/catalog/src/system_schema/information_schema/columns.rs index e92efd3bebf..6e0524390ee 100644 --- a/src/catalog/src/system_schema/information_schema/columns.rs +++ b/src/catalog/src/system_schema/information_schema/columns.rs @@ -43,7 +43,10 @@ use crate::error::{ CreateRecordBatchSnafu, InternalSnafu, Result, UpgradeWeakCatalogManagerRefSnafu, }; use crate::information_schema::Predicates; -use crate::system_schema::information_schema::{COLUMNS, InformationTable}; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{ + COLUMNS, InformationSchemaTableScope, InformationTable, +}; #[derive(Debug)] pub(super) struct InformationSchemaColumns { @@ -160,6 +163,12 @@ impl InformationSchemaColumns { } impl InformationTable for InformationSchemaColumns { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Catalog + } +} + +impl SystemTable for InformationSchemaColumns { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_COLUMNS_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/flow_statistics.rs b/src/catalog/src/system_schema/information_schema/flow_statistics.rs index 6163461eda7..218104765fd 100644 --- a/src/catalog/src/system_schema/information_schema/flow_statistics.rs +++ b/src/catalog/src/system_schema/information_schema/flow_statistics.rs @@ -41,7 +41,8 @@ use store_api::storage::{ScanRequest, TableId}; use crate::CatalogManager; use crate::error::{CreateRecordBatchSnafu, InternalSnafu, ListFlowsSnafu, Result}; use crate::information_schema::{FLOW_STATISTICS, Predicates}; -use crate::system_schema::information_schema::InformationTable; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{InformationSchemaTableScope, InformationTable}; use crate::system_schema::utils; const INIT_CAPACITY: usize = 42; @@ -108,6 +109,12 @@ impl InformationSchemaFlowStatistics { } impl InformationTable for InformationSchemaFlowStatistics { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Catalog + } +} + +impl SystemTable for InformationSchemaFlowStatistics { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_FLOW_STATISTICS_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/flows.rs b/src/catalog/src/system_schema/information_schema/flows.rs index 12a8783b58e..5530d67bb8e 100644 --- a/src/catalog/src/system_schema/information_schema/flows.rs +++ b/src/catalog/src/system_schema/information_schema/flows.rs @@ -50,7 +50,8 @@ use crate::error::{ Result, UpgradeWeakCatalogManagerRefSnafu, }; use crate::information_schema::{FLOWS, Predicates}; -use crate::system_schema::information_schema::InformationTable; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{InformationSchemaTableScope, InformationTable}; use crate::system_schema::utils; const INIT_CAPACITY: usize = 42; @@ -195,6 +196,12 @@ impl InformationSchemaFlows { } impl InformationTable for InformationSchemaFlows { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Catalog + } +} + +impl SystemTable for InformationSchemaFlows { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_FLOW_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/key_column_usage.rs b/src/catalog/src/system_schema/information_schema/key_column_usage.rs index 4f8f116afaf..46d10829758 100644 --- a/src/catalog/src/system_schema/information_schema/key_column_usage.rs +++ b/src/catalog/src/system_schema/information_schema/key_column_usage.rs @@ -35,8 +35,10 @@ use crate::CatalogManager; use crate::error::{ CreateRecordBatchSnafu, InternalSnafu, Result, UpgradeWeakCatalogManagerRefSnafu, }; +use crate::system_schema::SystemTable; use crate::system_schema::information_schema::{ - InformationTable, KEY_COLUMN_USAGE, Predicates, primary_key_encoding_index_type, + InformationSchemaTableScope, InformationTable, KEY_COLUMN_USAGE, Predicates, + primary_key_encoding_index_type, }; pub const CONSTRAINT_SCHEMA: &str = "constraint_schema"; @@ -148,6 +150,12 @@ impl InformationSchemaKeyColumnUsage { } impl InformationTable for InformationSchemaKeyColumnUsage { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Catalog + } +} + +impl SystemTable for InformationSchemaKeyColumnUsage { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_KEY_COLUMN_USAGE_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/partitions.rs b/src/catalog/src/system_schema/information_schema/partitions.rs index 1bfe3f634fd..3bb3c29b704 100644 --- a/src/catalog/src/system_schema/information_schema/partitions.rs +++ b/src/catalog/src/system_schema/information_schema/partitions.rs @@ -44,7 +44,10 @@ use crate::error::{ Result, UpgradeWeakCatalogManagerRefSnafu, }; use crate::kvbackend::KvBackendCatalogManager; -use crate::system_schema::information_schema::{InformationTable, PARTITIONS, Predicates}; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{ + InformationSchemaTableScope, InformationTable, PARTITIONS, Predicates, +}; const TABLE_CATALOG: &str = "table_catalog"; const TABLE_SCHEMA: &str = "table_schema"; @@ -167,6 +170,12 @@ impl InformationSchemaPartitions { } impl InformationTable for InformationSchemaPartitions { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Catalog + } +} + +impl SystemTable for InformationSchemaPartitions { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_PARTITIONS_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/procedure_info.rs b/src/catalog/src/system_schema/information_schema/procedure_info.rs index b9a892d2ac8..e9f3490a592 100644 --- a/src/catalog/src/system_schema/information_schema/procedure_info.rs +++ b/src/catalog/src/system_schema/information_schema/procedure_info.rs @@ -35,7 +35,10 @@ use store_api::storage::{ScanRequest, TableId}; use crate::CatalogManager; use crate::error::{CreateRecordBatchSnafu, InternalSnafu, Result}; -use crate::system_schema::information_schema::{InformationTable, PROCEDURE_INFO, Predicates}; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{ + InformationSchemaTableScope, InformationTable, PROCEDURE_INFO, Predicates, +}; use crate::system_schema::utils; const PROCEDURE_ID: &str = "procedure_id"; @@ -97,6 +100,12 @@ impl InformationSchemaProcedureInfo { } impl InformationTable for InformationSchemaProcedureInfo { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Global + } +} + +impl SystemTable for InformationSchemaProcedureInfo { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_PROCEDURE_INFO_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/process_list.rs b/src/catalog/src/system_schema/information_schema/process_list.rs index fb453c8c333..02d3148197b 100644 --- a/src/catalog/src/system_schema/information_schema/process_list.rs +++ b/src/catalog/src/system_schema/information_schema/process_list.rs @@ -36,7 +36,8 @@ use store_api::storage::{ScanRequest, TableId}; use crate::error::{self, InternalSnafu}; use crate::information_schema::Predicates; use crate::process_manager::ProcessManagerRef; -use crate::system_schema::information_schema::InformationTable; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{InformationSchemaTableScope, InformationTable}; /// Column names of `information_schema.process_list` pub const ID: &str = "id"; @@ -82,6 +83,12 @@ impl InformationSchemaProcessList { } impl InformationTable for InformationSchemaProcessList { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Global + } +} + +impl SystemTable for InformationSchemaProcessList { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_PROCESS_LIST_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/recycle_bin.rs b/src/catalog/src/system_schema/information_schema/recycle_bin.rs index c2022cf23da..7019b840507 100644 --- a/src/catalog/src/system_schema/information_schema/recycle_bin.rs +++ b/src/catalog/src/system_schema/information_schema/recycle_bin.rs @@ -31,7 +31,10 @@ use store_api::storage::{ScanRequest, TableId}; use crate::CatalogManager; use crate::error::{CreateRecordBatchSnafu, InternalSnafu, Result, TableMetadataManagerSnafu}; -use crate::system_schema::information_schema::{InformationTable, Predicates, RECYCLE_BIN}; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{ + InformationSchemaTableScope, InformationTable, Predicates, RECYCLE_BIN, +}; use crate::system_schema::utils; const OBJECT_ID: &str = "object_id"; @@ -118,6 +121,12 @@ impl InformationSchemaRecycleBin { } impl InformationTable for InformationSchemaRecycleBin { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Catalog + } +} + +impl SystemTable for InformationSchemaRecycleBin { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_RECYCLE_BIN_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/region_info.rs b/src/catalog/src/system_schema/information_schema/region_info.rs index 3fad1c84405..defb32df904 100644 --- a/src/catalog/src/system_schema/information_schema/region_info.rs +++ b/src/catalog/src/system_schema/information_schema/region_info.rs @@ -27,8 +27,10 @@ use store_api::storage::{ScanRequest, TableId}; use crate::CatalogManager; use crate::error::{ProjectSchemaSnafu, Result}; use crate::information_schema::{ - DatanodeInspectKind, DatanodeInspectRequest, InformationTable, REGION_INFO, + DatanodeInspectKind, DatanodeInspectRequest, InformationSchemaTableScope, InformationTable, + REGION_INFO, }; +use crate::system_schema::SystemTable; use crate::system_schema::utils; /// Information schema table for region info. @@ -47,6 +49,12 @@ impl InformationSchemaRegionInfo { } impl InformationTable for InformationSchemaRegionInfo { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Global + } +} + +impl SystemTable for InformationSchemaRegionInfo { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_REGION_INFO_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/region_peers.rs b/src/catalog/src/system_schema/information_schema/region_peers.rs index 9eddb061f80..40ed16f1dc4 100644 --- a/src/catalog/src/system_schema/information_schema/region_peers.rs +++ b/src/catalog/src/system_schema/information_schema/region_peers.rs @@ -41,7 +41,10 @@ use crate::error::{ UpgradeWeakCatalogManagerRefSnafu, }; use crate::kvbackend::KvBackendCatalogManager; -use crate::system_schema::information_schema::{InformationTable, Predicates, REGION_PEERS}; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{ + InformationSchemaTableScope, InformationTable, Predicates, REGION_PEERS, +}; pub const TABLE_CATALOG: &str = "table_catalog"; pub const TABLE_SCHEMA: &str = "table_schema"; @@ -105,6 +108,12 @@ impl InformationSchemaRegionPeers { } impl InformationTable for InformationSchemaRegionPeers { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Catalog + } +} + +impl SystemTable for InformationSchemaRegionPeers { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_REGION_PEERS_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/region_statistics.rs b/src/catalog/src/system_schema/information_schema/region_statistics.rs index 8d1a15ddcc3..8a7c19adc00 100644 --- a/src/catalog/src/system_schema/information_schema/region_statistics.rs +++ b/src/catalog/src/system_schema/information_schema/region_statistics.rs @@ -38,7 +38,10 @@ use store_api::storage::{ScanRequest, TableId}; use crate::CatalogManager; use crate::error::{CreateRecordBatchSnafu, InternalSnafu, Result}; use crate::information_schema::Predicates; -use crate::system_schema::information_schema::{InformationTable, REGION_STATISTICS}; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{ + InformationSchemaTableScope, InformationTable, REGION_STATISTICS, +}; use crate::system_schema::utils; const REGION_ID: &str = "region_id"; @@ -138,6 +141,12 @@ impl InformationSchemaRegionStatistics { } impl InformationTable for InformationSchemaRegionStatistics { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Global + } +} + +impl SystemTable for InformationSchemaRegionStatistics { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_REGION_STATISTICS_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/schemata.rs b/src/catalog/src/system_schema/information_schema/schemata.rs index c8756057cdf..d9654a48bd5 100644 --- a/src/catalog/src/system_schema/information_schema/schemata.rs +++ b/src/catalog/src/system_schema/information_schema/schemata.rs @@ -36,7 +36,10 @@ use crate::error::{ CreateRecordBatchSnafu, InternalSnafu, Result, TableMetadataManagerSnafu, UpgradeWeakCatalogManagerRefSnafu, }; -use crate::system_schema::information_schema::{InformationTable, Predicates, SCHEMATA}; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{ + InformationSchemaTableScope, InformationTable, Predicates, SCHEMATA, +}; use crate::system_schema::utils; pub const CATALOG_NAME: &str = "catalog_name"; @@ -93,6 +96,12 @@ impl InformationSchemaSchemata { } impl InformationTable for InformationSchemaSchemata { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Catalog + } +} + +impl SystemTable for InformationSchemaSchemata { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_SCHEMATA_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/ssts.rs b/src/catalog/src/system_schema/information_schema/ssts.rs index e364bddfd3d..9006ab6fed9 100644 --- a/src/catalog/src/system_schema/information_schema/ssts.rs +++ b/src/catalog/src/system_schema/information_schema/ssts.rs @@ -30,9 +30,10 @@ use store_api::storage::{ScanRequest, TableId}; use crate::CatalogManager; use crate::error::{ProjectSchemaSnafu, Result}; use crate::information_schema::{ - DatanodeInspectKind, DatanodeInspectRequest, InformationTable, SSTS_INDEX_META, SSTS_MANIFEST, - SSTS_STORAGE, + DatanodeInspectKind, DatanodeInspectRequest, InformationSchemaTableScope, InformationTable, + SSTS_INDEX_META, SSTS_MANIFEST, SSTS_STORAGE, }; +use crate::system_schema::SystemTable; use crate::system_schema::utils; fn projected_schema(schema: &SchemaRef, request: &ScanRequest) -> Result { @@ -75,6 +76,12 @@ impl InformationSchemaSstsManifest { } impl InformationTable for InformationSchemaSstsManifest { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Global + } +} + +impl SystemTable for InformationSchemaSstsManifest { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_SSTS_MANIFEST_TABLE_ID } @@ -134,6 +141,12 @@ impl InformationSchemaSstsStorage { } impl InformationTable for InformationSchemaSstsStorage { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Global + } +} + +impl SystemTable for InformationSchemaSstsStorage { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_SSTS_STORAGE_TABLE_ID } @@ -194,6 +207,12 @@ impl InformationSchemaSstsIndexMeta { } impl InformationTable for InformationSchemaSstsIndexMeta { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Global + } +} + +impl SystemTable for InformationSchemaSstsIndexMeta { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_SSTS_INDEX_META_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/statistics.rs b/src/catalog/src/system_schema/information_schema/statistics.rs index 70312350759..4aeacd21ebd 100644 --- a/src/catalog/src/system_schema/information_schema/statistics.rs +++ b/src/catalog/src/system_schema/information_schema/statistics.rs @@ -39,12 +39,14 @@ use crate::CatalogManager; use crate::error::{ CreateRecordBatchSnafu, InternalSnafu, Result, UpgradeWeakCatalogManagerRefSnafu, }; +use crate::system_schema::SystemTable; use crate::system_schema::information_schema::key_column_usage::{ CONSTRAINT_NAME_FULLTEXT_INDEX, CONSTRAINT_NAME_INVERTED_INDEX, CONSTRAINT_NAME_PRI, CONSTRAINT_NAME_SKIPPING_INDEX, CONSTRAINT_NAME_TIME_INDEX, }; use crate::system_schema::information_schema::{ - InformationTable, Predicates, STATISTICS, primary_key_encoding_index_type, + InformationSchemaTableScope, InformationTable, Predicates, STATISTICS, + primary_key_encoding_index_type, }; pub const TABLE_CATALOG: &str = "table_catalog"; @@ -135,6 +137,12 @@ impl InformationSchemaStatistics { } impl InformationTable for InformationSchemaStatistics { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Catalog + } +} + +impl SystemTable for InformationSchemaStatistics { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_STATISTICS_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/table_constraints.rs b/src/catalog/src/system_schema/information_schema/table_constraints.rs index 2208d303c2e..aedbe251935 100644 --- a/src/catalog/src/system_schema/information_schema/table_constraints.rs +++ b/src/catalog/src/system_schema/information_schema/table_constraints.rs @@ -40,7 +40,10 @@ use crate::information_schema::Predicates; use crate::information_schema::key_column_usage::{ CONSTRAINT_NAME_PRI, CONSTRAINT_NAME_TIME_INDEX, }; -use crate::system_schema::information_schema::{InformationTable, TABLE_CONSTRAINTS}; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{ + InformationSchemaTableScope, InformationTable, TABLE_CONSTRAINTS, +}; /// The `TABLE_CONSTRAINTS` table describes which tables have constraints. #[derive(Debug)] @@ -102,6 +105,12 @@ impl InformationSchemaTableConstraints { } impl InformationTable for InformationSchemaTableConstraints { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Catalog + } +} + +impl SystemTable for InformationSchemaTableConstraints { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_TABLE_CONSTRAINTS_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/table_semantics.rs b/src/catalog/src/system_schema/information_schema/table_semantics.rs index 07f1a844f9e..b571b03d40f 100644 --- a/src/catalog/src/system_schema/information_schema/table_semantics.rs +++ b/src/catalog/src/system_schema/information_schema/table_semantics.rs @@ -59,7 +59,10 @@ use crate::CatalogManager; use crate::error::{ CreateRecordBatchSnafu, InternalSnafu, Result, UpgradeWeakCatalogManagerRefSnafu, }; -use crate::system_schema::information_schema::{InformationTable, Predicates, TABLE_SEMANTICS}; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{ + InformationSchemaTableScope, InformationTable, Predicates, TABLE_SEMANTICS, +}; use crate::system_schema::semantic_graph::{EntityGraphProviderRef, TableEntityDeclaration}; use crate::system_schema::utils; @@ -235,6 +238,12 @@ impl InformationSchemaTableSemantics { } impl InformationTable for InformationSchemaTableSemantics { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Catalog + } +} + +impl SystemTable for InformationSchemaTableSemantics { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_TABLE_SEMANTICS_TABLE_ID } @@ -514,6 +523,17 @@ mod tests { ); } + #[test] + fn extract_system_table_scope() { + let info = table_info(&[(table::requests::SEMANTIC_TABLE_SCOPE, "catalog")]); + let row = SemanticRow::extract(&info).unwrap(); + assert_eq!( + row.options_json.as_deref(), + Some(r#"{"table_scope":"catalog"}"#) + ); + assert!(row.signal_type.is_none()); + } + #[test] fn extract_skips_untagged_table() { let info = table_info(&[("ttl", "7d")]); diff --git a/src/catalog/src/system_schema/information_schema/tables.rs b/src/catalog/src/system_schema/information_schema/tables.rs index 6175c17d39b..6c9c0167da0 100644 --- a/src/catalog/src/system_schema/information_schema/tables.rs +++ b/src/catalog/src/system_schema/information_schema/tables.rs @@ -43,7 +43,10 @@ use crate::error::{ UpgradeWeakCatalogManagerRefSnafu, }; use crate::kvbackend::KvBackendCatalogManager; -use crate::system_schema::information_schema::{InformationTable, Predicates, TABLES}; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{ + InformationSchemaTableScope, InformationTable, Predicates, TABLES, +}; use crate::system_schema::utils; pub const TABLE_CATALOG: &str = "table_catalog"; @@ -139,6 +142,12 @@ impl InformationSchemaTables { } impl InformationTable for InformationSchemaTables { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Catalog + } +} + +impl SystemTable for InformationSchemaTables { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_TABLES_TABLE_ID } diff --git a/src/catalog/src/system_schema/information_schema/views.rs b/src/catalog/src/system_schema/information_schema/views.rs index d1eb3b80ac0..65e16dfe120 100644 --- a/src/catalog/src/system_schema/information_schema/views.rs +++ b/src/catalog/src/system_schema/information_schema/views.rs @@ -38,7 +38,10 @@ use crate::error::{ UpgradeWeakCatalogManagerRefSnafu, ViewInfoNotFoundSnafu, }; use crate::kvbackend::KvBackendCatalogManager; -use crate::system_schema::information_schema::{InformationTable, Predicates, VIEWS}; +use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{ + InformationSchemaTableScope, InformationTable, Predicates, VIEWS, +}; const INIT_CAPACITY: usize = 42; pub const TABLE_CATALOG: &str = "table_catalog"; @@ -102,6 +105,12 @@ impl InformationSchemaViews { } impl InformationTable for InformationSchemaViews { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Catalog + } +} + +impl SystemTable for InformationSchemaViews { fn table_id(&self) -> TableId { INFORMATION_SCHEMA_VIEW_TABLE_ID } diff --git a/src/catalog/src/system_schema/memory_table.rs b/src/catalog/src/system_schema/memory_table.rs index de5ff120b2f..c7246939c23 100644 --- a/src/catalog/src/system_schema/memory_table.rs +++ b/src/catalog/src/system_schema/memory_table.rs @@ -31,6 +31,7 @@ use store_api::storage::{ScanRequest, TableId}; use crate::error::{CreateRecordBatchSnafu, InternalSnafu, Result}; use crate::system_schema::SystemTable; +use crate::system_schema::information_schema::{InformationSchemaTableScope, InformationTable}; /// A memory table with specified schema and columns. #[derive(Debug)] @@ -104,6 +105,12 @@ impl DfPartitionStream for MemoryTable { } } +impl InformationTable for MemoryTable { + fn scope(&self) -> InformationSchemaTableScope { + InformationSchemaTableScope::Global + } +} + impl SystemTable for MemoryTable { fn table_id(&self) -> TableId { self.table_id diff --git a/src/table/src/requests/semantic.rs b/src/table/src/requests/semantic.rs index dbe28eb240f..05b1edb56f5 100644 --- a/src/table/src/requests/semantic.rs +++ b/src/table/src/requests/semantic.rs @@ -49,6 +49,11 @@ pub const SEMANTIC_PER_TABLE_INDEX_KEY: &str = "greptime.internal.semantic.per_t // ---- Common keys (all signals) ---- +/// Information-schema visibility: `catalog` for providers that filter rows to +/// their catalog, or `global` for catalog-independent data. Only registered +/// system-table metadata is trusted for authorization. +pub const SEMANTIC_TABLE_SCOPE: &str = "greptime.semantic.table_scope"; + /// Signal kind: one of [`SIGNAL_TYPE_TRACE`] / [`SIGNAL_TYPE_LOG`] / /// [`SIGNAL_TYPE_METRIC`] / [`SIGNAL_TYPE_EVENT`]. pub const SEMANTIC_SIGNAL_TYPE: &str = "greptime.semantic.signal_type"; @@ -154,6 +159,7 @@ pub const SEMANTIC_VALUE_MIXED: &str = "mixed"; /// so an unknown key like `greptime.semantic.unknown_key` does not silently land /// in a table's options. Adding a key to the vocabulary means adding it here. pub const SEMANTIC_OPTION_KEYS: &[&str] = &[ + SEMANTIC_TABLE_SCOPE, SEMANTIC_SIGNAL_TYPE, SEMANTIC_SOURCE, SEMANTIC_SOURCE_VERSION, @@ -282,6 +288,7 @@ pub fn validate_semantic_option(key: &str, value: &str) -> bool { return !value.is_empty() && value.split(',').all(|column| !column.trim().is_empty()); } match key { + SEMANTIC_TABLE_SCOPE => matches!(value, "catalog" | "global"), SEMANTIC_PIPELINE | SEMANTIC_SOURCE_VERSION | SEMANTIC_METRIC_UNIT @@ -404,6 +411,11 @@ mod tests { #[test] fn test_validate_semantic_option() { // Enum keys reject out-of-domain values. + assert!(validate_semantic_option(SEMANTIC_TABLE_SCOPE, "catalog")); + assert!(validate_semantic_option(SEMANTIC_TABLE_SCOPE, "global")); + assert!(!validate_semantic_option(SEMANTIC_TABLE_SCOPE, "cluster")); + assert!(!validate_semantic_option(SEMANTIC_TABLE_SCOPE, "unknown")); + assert!(!validate_semantic_option(SEMANTIC_TABLE_SCOPE, "")); assert!(validate_semantic_option(SEMANTIC_SIGNAL_TYPE, "metric")); assert!(!validate_semantic_option(SEMANTIC_SIGNAL_TYPE, "spans")); assert!(validate_semantic_option(SEMANTIC_METRIC_TYPE, "counter")); diff --git a/tests/cases/standalone/common/information_schema/table_semantics.result b/tests/cases/standalone/common/information_schema/table_semantics.result index ee66ea3019b..6aac406f7a0 100644 --- a/tests/cases/standalone/common/information_schema/table_semantics.result +++ b/tests/cases/standalone/common/information_schema/table_semantics.result @@ -54,6 +54,7 @@ Affected Rows: 0 SELECT table_schema, table_name, signal_type, source, source_version, pipeline, metadata_quality, semantic_options FROM information_schema.table_semantics +WHERE table_schema = 'public' ORDER BY table_name; +--------------+----------------+-------------+---------------+----------------+--------------------+------------------+-----------------------------------------------------------------+ @@ -63,6 +64,22 @@ ORDER BY table_name; | public | traces_tagged | trace | opentelemetry | | | | {"trace.conventions":"https://opentelemetry.io/schemas/1.27.0"} | +--------------+----------------+-------------+---------------+----------------+--------------------+------------------+-----------------------------------------------------------------+ +-- System table scope is exposed without changing the view's columns. +SELECT table_name, semantic_options +FROM information_schema.table_semantics +WHERE table_schema = 'information_schema' + AND table_name IN ('build_info', 'partitions', 'process_list', 'table_semantics') +ORDER BY table_name; + ++-----------------+---------------------------+ +| table_name | semantic_options | ++-----------------+---------------------------+ +| build_info | {"table_scope":"global"} | +| partitions | {"table_scope":"catalog"} | +| process_list | {"table_scope":"global"} | +| table_semantics | {"table_scope":"catalog"} | ++-----------------+---------------------------+ + -- Predicate pushdown on a promoted column. SELECT table_name, signal_type FROM information_schema.table_semantics diff --git a/tests/cases/standalone/common/information_schema/table_semantics.sql b/tests/cases/standalone/common/information_schema/table_semantics.sql index 577c1edb693..d20d47e64e0 100644 --- a/tests/cases/standalone/common/information_schema/table_semantics.sql +++ b/tests/cases/standalone/common/information_schema/table_semantics.sql @@ -32,6 +32,14 @@ CREATE TABLE plain_table ( SELECT table_schema, table_name, signal_type, source, source_version, pipeline, metadata_quality, semantic_options FROM information_schema.table_semantics +WHERE table_schema = 'public' +ORDER BY table_name; + +-- System table scope is exposed without changing the view's columns. +SELECT table_name, semantic_options +FROM information_schema.table_semantics +WHERE table_schema = 'information_schema' + AND table_name IN ('build_info', 'partitions', 'process_list', 'table_semantics') ORDER BY table_name; -- Predicate pushdown on a promoted column. diff --git a/tests/cases/standalone/common/show/show_databases_tables.result b/tests/cases/standalone/common/show/show_databases_tables.result index 1c9e3a32460..29b11ff23f7 100644 --- a/tests/cases/standalone/common/show/show_databases_tables.result +++ b/tests/cases/standalone/common/show/show_databases_tables.result @@ -135,48 +135,48 @@ SHOW TABLE STATUS; +++++++++++++++++++ |Name|Engine|Version|Row_format|Rows|Avg_row_length|Data_length|Max_data_length|Index_length|Data_free|Auto_increment|Create_time|Update_time|Check_time|Collation|Checksum|Create_options|Comment| +++++++++++++++++++ -|build_info||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|character_sets||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|check_constraints||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|cluster_info||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|collation_character_set_applicability||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|collations||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|column_privileges||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|column_statistics||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|columns||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|engines||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|events||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|files||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|flow_statistics||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|flows||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|global_status||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|key_column_usage||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|optimizer_trace||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|parameters||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|partitions||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|plugins||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|procedure_info||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|process_list||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|processlist||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|profiling||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|referential_constraints||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|region_info||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|region_peers||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|region_statistics||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|routines||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|schema_privileges||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|schemata||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|session_status||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|ssts_index_meta||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|ssts_manifest||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|ssts_storage||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|statistics||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|table_constraints||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|table_privileges||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|table_semantics||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|tables||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|user_privileges||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| -|views||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| +|build_info||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|character_sets||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|check_constraints||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|cluster_info||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|collation_character_set_applicability||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|collations||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|column_privileges||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|column_statistics||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|columns||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +|engines||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|events||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|files||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|flow_statistics||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +|flows||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +|global_status||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|key_column_usage||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +|optimizer_trace||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|parameters||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|partitions||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +|plugins||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|procedure_info||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|process_list||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|processlist||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|profiling||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|referential_constraints||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|region_info||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|region_peers||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +|region_statistics||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|routines||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|schema_privileges||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|schemata||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +|session_status||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|ssts_index_meta||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|ssts_manifest||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|ssts_storage||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|statistics||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +|table_constraints||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +|table_privileges||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|table_semantics||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +|tables||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +|user_privileges||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global|| +|views||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +++++++++++++++++++ -- SQLNESS REPLACE (\s[\-0-9T:\.]{15,}) DATETIME @@ -186,7 +186,7 @@ SHOW TABLE STATUS LIKE 'tables'; +++++++++++++++++++ |Name|Engine|Version|Row_format|Rows|Avg_row_length|Data_length|Max_data_length|Index_length|Data_free|Auto_increment|Create_time|Update_time|Check_time|Collation|Checksum|Create_options|Comment| +++++++++++++++++++ -|tables||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| +|tables||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +++++++++++++++++++ -- SQLNESS REPLACE (\s[\-0-9T:\.]{15,}) DATETIME @@ -196,7 +196,7 @@ SHOW TABLE STATUS WHERE Name = 'tables'; +++++++++++++++++++ |Name|Engine|Version|Row_format|Rows|Avg_row_length|Data_length|Max_data_length|Index_length|Data_free|Auto_increment|Create_time|Update_time|Check_time|Collation|Checksum|Create_options|Comment| +++++++++++++++++++ -|tables||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0||| +|tables||11|Fixed|0|0|0|0|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog|| +++++++++++++++++++ -- SQLNESS REPLACE (\s[\-0-9T:\.]{15,}) DATETIME diff --git a/tests/cases/standalone/common/system/information_schema.result b/tests/cases/standalone/common/system/information_schema.result index fa9dd02a782..a83d66f4109 100644 --- a/tests/cases/standalone/common/system/information_schema.result +++ b/tests/cases/standalone/common/system/information_schema.result @@ -15,48 +15,48 @@ order by table_schema, table_name; +++++++++++++++++++++++++ |table_catalog|table_schema|table_name|table_type|table_id|data_length|max_data_length|index_length|max_index_length|avg_row_length|engine|version|row_format|table_rows|data_free|auto_increment|create_time|update_time|check_time|table_collation|checksum|create_options|table_comment|temporary| +++++++++++++++++++++++++ -|greptime|information_schema|build_info|LOCALTEMPORARY|8|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|character_sets|LOCALTEMPORARY|9|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|check_constraints|LOCALTEMPORARY|12|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|cluster_info|LOCALTEMPORARY|31|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|collation_character_set_applicability|LOCALTEMPORARY|11|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|collations|LOCALTEMPORARY|10|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|column_privileges|LOCALTEMPORARY|6|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|column_statistics|LOCALTEMPORARY|7|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|columns|LOCALTEMPORARY|4|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|engines|LOCALTEMPORARY|5|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|events|LOCALTEMPORARY|13|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|files|LOCALTEMPORARY|14|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|flow_statistics|LOCALTEMPORARY|45|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|flows|LOCALTEMPORARY|33|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|global_status|LOCALTEMPORARY|25|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|key_column_usage|LOCALTEMPORARY|16|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|optimizer_trace|LOCALTEMPORARY|17|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|parameters|LOCALTEMPORARY|18|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|partitions|LOCALTEMPORARY|28|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|plugins|LOCALTEMPORARY|47|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|procedure_info|LOCALTEMPORARY|34|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|process_list|LOCALTEMPORARY|36|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|processlist|LOCALTEMPORARY|49|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|profiling|LOCALTEMPORARY|19|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|referential_constraints|LOCALTEMPORARY|20|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|region_info|LOCALTEMPORARY|41|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|region_peers|LOCALTEMPORARY|29|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|region_statistics|LOCALTEMPORARY|35|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|routines|LOCALTEMPORARY|21|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|schema_privileges|LOCALTEMPORARY|22|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|schemata|LOCALTEMPORARY|15|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|session_status|LOCALTEMPORARY|26|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|ssts_index_meta|LOCALTEMPORARY|39|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|ssts_manifest|LOCALTEMPORARY|37|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|ssts_storage|LOCALTEMPORARY|38|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|statistics|LOCALTEMPORARY|43|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|table_constraints|LOCALTEMPORARY|30|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|table_privileges|LOCALTEMPORARY|23|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|table_semantics|LOCALTEMPORARY|42|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|tables|LOCALTEMPORARY|3|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|user_privileges|LOCALTEMPORARY|48|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| -|greptime|information_schema|views|LOCALTEMPORARY|32|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| +|greptime|information_schema|build_info|LOCALTEMPORARY|8|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|character_sets|LOCALTEMPORARY|9|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|check_constraints|LOCALTEMPORARY|12|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|cluster_info|LOCALTEMPORARY|31|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|collation_character_set_applicability|LOCALTEMPORARY|11|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|collations|LOCALTEMPORARY|10|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|column_privileges|LOCALTEMPORARY|6|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|column_statistics|LOCALTEMPORARY|7|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|columns|LOCALTEMPORARY|4|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|engines|LOCALTEMPORARY|5|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|events|LOCALTEMPORARY|13|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|files|LOCALTEMPORARY|14|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|flow_statistics|LOCALTEMPORARY|45|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|flows|LOCALTEMPORARY|33|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|global_status|LOCALTEMPORARY|25|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|key_column_usage|LOCALTEMPORARY|16|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|optimizer_trace|LOCALTEMPORARY|17|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|parameters|LOCALTEMPORARY|18|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|partitions|LOCALTEMPORARY|28|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|plugins|LOCALTEMPORARY|47|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|procedure_info|LOCALTEMPORARY|34|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|process_list|LOCALTEMPORARY|36|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|processlist|LOCALTEMPORARY|49|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|profiling|LOCALTEMPORARY|19|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|referential_constraints|LOCALTEMPORARY|20|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|region_info|LOCALTEMPORARY|41|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|region_peers|LOCALTEMPORARY|29|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|region_statistics|LOCALTEMPORARY|35|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|routines|LOCALTEMPORARY|21|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|schema_privileges|LOCALTEMPORARY|22|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|schemata|LOCALTEMPORARY|15|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|session_status|LOCALTEMPORARY|26|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|ssts_index_meta|LOCALTEMPORARY|39|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|ssts_manifest|LOCALTEMPORARY|37|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|ssts_storage|LOCALTEMPORARY|38|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|statistics|LOCALTEMPORARY|43|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|table_constraints|LOCALTEMPORARY|30|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|table_privileges|LOCALTEMPORARY|23|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|table_semantics|LOCALTEMPORARY|42|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|tables|LOCALTEMPORARY|3|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|user_privileges|LOCALTEMPORARY|48|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|views|LOCALTEMPORARY|32|0|0|0|0|0||11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|greptime.semantic.table_scope=catalog||Y| |greptime|public|numbers|LOCALTEMPORARY|2|0|0|0|0|0|test_engine|11|Fixed|0|0|0|DATETIME|DATETIME||utf8_bin|0|||Y| +++++++++++++++++++++++++ diff --git a/tests/cases/standalone/common/view/create.result b/tests/cases/standalone/common/view/create.result index 577583515e9..82d6765ded8 100644 --- a/tests/cases/standalone/common/view/create.result +++ b/tests/cases/standalone/common/view/create.result @@ -96,52 +96,52 @@ ORDER BY TABLE_NAME, TABLE_TYPE; +++++++++++++++++++++++++ |table_catalog|table_schema|table_name|table_type|table_id|data_length|max_data_length|index_length|max_index_length|avg_row_length|engine|version|row_format|table_rows|data_free|auto_increment|create_time|update_time|check_time|table_collation|checksum|create_options|table_comment|temporary| +++++++++++++++++++++++++ -|greptime|information_schema|build_info|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|character_sets|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|check_constraints|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|cluster_info|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|collation_character_set_applicability|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|collations|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|column_privileges|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|column_statistics|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|columns|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|engines|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|events|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|files|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|flow_statistics|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|flows|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|global_status|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|key_column_usage|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| +|greptime|information_schema|build_info|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|character_sets|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|check_constraints|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|cluster_info|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|collation_character_set_applicability|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|collations|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|column_privileges|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|column_statistics|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|columns|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|engines|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|events|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|files|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|flow_statistics|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|flows|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|global_status|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|key_column_usage|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=catalog||Y| |greptime|public|numbers|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID|test_engine|ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|optimizer_trace|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|parameters|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|partitions|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|plugins|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|procedure_info|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|process_list|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|processlist|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|profiling|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|referential_constraints|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|region_info|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|region_peers|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|region_statistics|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|routines|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|schema_privileges|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|schemata|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|session_status|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|ssts_index_meta|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|ssts_manifest|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|ssts_storage|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|statistics|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|table_constraints|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|table_privileges|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|table_semantics|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|tables|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| +|greptime|information_schema|optimizer_trace|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|parameters|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|partitions|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|plugins|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|procedure_info|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|process_list|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|processlist|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|profiling|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|referential_constraints|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|region_info|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|region_peers|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|region_statistics|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|routines|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|schema_privileges|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|schemata|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|session_status|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|ssts_index_meta|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|ssts_manifest|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|ssts_storage|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|statistics|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|table_constraints|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|table_privileges|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|table_semantics|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=catalog||Y| +|greptime|information_schema|tables|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=catalog||Y| |greptime|public|test_table|BASETABLE|ID|ID|ID|ID|ID|ID|mito|ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||N| |greptime|public|test_view|VIEW|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||N| |greptime|public|test_view2|VIEW|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||N| -|greptime|information_schema|user_privileges|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| -|greptime|information_schema|views|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|||Y| +|greptime|information_schema|user_privileges|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=global||Y| +|greptime|information_schema|views|LOCALTEMPORARY|ID|ID|ID|ID|ID|ID||ID|Fixed|ID|ID|ID|DATETIME|DATETIME||utf8_bin|ID|greptime.semantic.table_scope=catalog||Y| +++++++++++++++++++++++++ -- SQLNESS REPLACE (\s\d+\s) ID