mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-10-12 15:02:32 +00:00
feat(catalog): declare information-schema table scopes [Backport release/v1.3] (#9534)
feat(catalog): declare information-schema table scopes (#9504)
* feat(catalog): declare information-schema table scopes
* chore: rename cluster to global
* fix: update sqlness result
* refactor(catalog): require information-schema table scopes
---------
(cherry picked from commit 2df33380a7)
Signed-off-by: shuiyisong <xixing.sys@gmail.com>
Co-authored-by: shuiyisong <113876041+shuiyisong@users.noreply.github.com>
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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<ViewInfoCacheRef> {
|
||||
self.cache_registry.get().context(CacheNotFoundSnafu {
|
||||
name: "view_info_cache",
|
||||
|
||||
@@ -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<TableRef> {
|
||||
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<SystemTableRef>;
|
||||
}
|
||||
|
||||
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 {
|
||||
|
||||
@@ -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<dyn InformationSchemaTableFactory + Send + Sync>;
|
||||
@@ -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<SystemTableRef> {
|
||||
impl InformationSchemaProvider {
|
||||
fn information_table(&self, name: &str) -> Option<InformationTableRef> {
|
||||
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<SendableRecordBatchStream>;
|
||||
|
||||
fn scan_plan(&self, _request: ScanRequest) -> Result<Option<Arc<dyn ExecutionPlan>>> {
|
||||
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<T> 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<SendableRecordBatchStream> {
|
||||
InformationTable::to_stream(self, request)
|
||||
}
|
||||
|
||||
fn scan_plan(&self, request: ScanRequest) -> Result<Option<Arc<dyn ExecutionPlan>>> {
|
||||
InformationTable::scan_plan(self, request)
|
||||
}
|
||||
}
|
||||
pub type InformationTableRef = Arc<dyn InformationTable + Send + Sync>;
|
||||
|
||||
pub type InformationExtensionRef = Arc<dyn InformationExtension<Error = Error> + 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<SendableRecordBatchStream> {
|
||||
Ok(common_recordbatch::RecordBatches::empty().as_stream())
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn every_registered_information_schema_table_has_scope() {
|
||||
use InformationSchemaTableScope::{Catalog, Global};
|
||||
|
||||
let manager: Arc<dyn CatalogManager> = 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::<Vec<_>>()
|
||||
.await
|
||||
.unwrap();
|
||||
let output = batches
|
||||
.iter()
|
||||
.map(|batch| batch.pretty_print())
|
||||
.collect::<Vec<_>>()
|
||||
.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() {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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<SchemaRef> {
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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")]);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"));
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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|
|
||||
+++++++++++++++++++++++++
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user