Skip to content

Commit

Permalink
fix: fix create system database usage_schema
Browse files Browse the repository at this point in the history
  • Loading branch information
ZuoTiJia committed Oct 17, 2023
1 parent 8542c4f commit 1e64aba
Show file tree
Hide file tree
Showing 7 changed files with 45 additions and 25 deletions.
3 changes: 1 addition & 2 deletions coordinator/src/service.rs
Expand Up @@ -64,8 +64,7 @@ use crate::{

pub type CoordinatorRef = Arc<dyn Coordinator>;

const USAGE_SCHEMA: &str = "usage_schema";

use models::schema::USAGE_SCHEMA;
#[derive(Clone)]
pub struct CoordService {
node_id: u64,
Expand Down
3 changes: 1 addition & 2 deletions query_server/query/src/execution/ddl/create_database.rs
Expand Up @@ -64,7 +64,7 @@ async fn create_database(stmt: &CreateDatabase, machine: QueryStateMachineRef) -
.ok_or(MetaError::TenantNotFound {
tenant: tenant.to_string(),
})?;
// .context(MetaSnafu)?;

let CreateDatabase {
ref name,
ref options,
Expand All @@ -74,6 +74,5 @@ async fn create_database(stmt: &CreateDatabase, machine: QueryStateMachineRef) -
let mut database_schema = DatabaseSchema::new(machine.session.tenant(), name);
database_schema.config = options.clone();
client.create_db(database_schema).await?;
// .context(spi::MetaSnafu)?;
Ok(())
}
9 changes: 1 addition & 8 deletions query_server/query/src/execution/ddl/create_tenant.rs
@@ -1,13 +1,11 @@
use async_trait::async_trait;
use meta::error::MetaError;
use models::schema::{DatabaseSchema, DEFAULT_CATALOG};
use spi::query::execution::{Output, QueryStateMachineRef};
use spi::query::logical_planner::CreateTenant;
use spi::Result;
use trace::debug;

use crate::execution::ddl::DDLDefinitionTask;
use crate::metadata::USAGE_SCHEMA;

pub struct CreateTenantTask {
stmt: CreateTenant,
Expand Down Expand Up @@ -44,15 +42,10 @@ impl DDLDefinitionTask for CreateTenantTask {
// name: String
// options: TenantOptions
debug!("Create tenant {} with options [{}]", name, options);
let meta_client = query_state_machine
query_state_machine
.meta
.create_tenant(name.to_string(), options.clone())
.await?;
if name.eq(DEFAULT_CATALOG) {
meta_client
.create_db(DatabaseSchema::new(name, USAGE_SCHEMA))
.await?;
}
Ok(Output::Nil(()))
}
}
Expand Down
15 changes: 13 additions & 2 deletions query_server/query/src/metadata/mod.rs
Expand Up @@ -23,11 +23,10 @@ use meta::error::MetaError;
use meta::model::MetaClientRef;
use models::auth::user::UserDesc;
use models::object_reference::{Resolve, ResolvedTable};
use models::schema::{Precision, Tenant, DEFAULT_CATALOG};
use models::schema::{Precision, Tenant, DEFAULT_CATALOG, DEFAULT_DATABASE};
use parking_lot::RwLock;
use spi::query::function::FuncMetaManagerRef;
use spi::query::session::SessionCtx;
pub use usage_schema_provider::USAGE_SCHEMA;

pub use self::base_table::BaseTableProvider;
use self::cluster_schema_provider::ClusterSchemaProvider;
Expand All @@ -43,6 +42,7 @@ mod usage_schema_provider;

pub const CLUSTER_SCHEMA: &str = "CLUSTER_SCHEMA";
pub const INFORMATION_SCHEMA: &str = "INFORMATION_SCHEMA";
pub const USAGE_SCHEMA: &str = "usage_schema";

/// remote meta
pub struct RemoteCatalogMeta {}
Expand Down Expand Up @@ -343,3 +343,14 @@ impl TableSet {
self.tables.insert(tbl.into());
}
}

pub fn is_system_database(tenant: &str, database: &str) -> bool {
if tenant.eq_ignore_ascii_case(DEFAULT_CATALOG)
&& database.eq_ignore_ascii_case(DEFAULT_DATABASE)
{
return true;
}
database.eq_ignore_ascii_case(CLUSTER_SCHEMA)
|| database.eq_ignore_ascii_case(INFORMATION_SCHEMA)
|| database.eq_ignore_ascii_case(USAGE_SCHEMA)
}
4 changes: 1 addition & 3 deletions query_server/query/src/metadata/usage_schema_provider/mod.rs
Expand Up @@ -5,14 +5,12 @@ use datafusion::datasource::{provider_as_source, TableProvider, ViewTable};
use datafusion::logical_expr::{binary_expr, col, LogicalPlanBuilder, Operator};
use datafusion::prelude::lit;
use meta::error::MetaError;
use models::schema::DEFAULT_CATALOG;
use spi::query::session::SessionCtx;
use spi::{QueryError, Result};

use super::TableHandleProviderRef;
use crate::data_source::table_source::TableHandle;

pub const USAGE_SCHEMA: &str = "usage_schema";
use crate::metadata::{DEFAULT_CATALOG, USAGE_SCHEMA};

pub struct UsageSchemaProvider {
table_factories: HashMap<String, BoxUsageSchemaTableFactory>,
Expand Down
12 changes: 4 additions & 8 deletions query_server/query/src/sql/planner.rs
Expand Up @@ -53,7 +53,7 @@ use models::object_reference::{Resolve, ResolvedTable};
use models::oid::{Identifier, Oid};
use models::schema::{
ColumnType, DatabaseOptions, Duration, Precision, TableColumn, Tenant, TskvTableSchema,
TskvTableSchemaRef, Watermark, DEFAULT_CATALOG, DEFAULT_DATABASE, TIME_FIELD,
TskvTableSchemaRef, Watermark, DEFAULT_CATALOG, TIME_FIELD,
};
use models::utils::SeqIdGenerator;
use models::{ColumnId, ValueType};
Expand Down Expand Up @@ -93,7 +93,7 @@ use crate::data_source::table_source::{TableHandle, TableSourceAdapter, TEMP_LOC
use crate::extension::logical::logical_plan_builder::LogicalPlanBuilderExt;
use crate::extension::logical::plan_node::update::UpdateNode;
use crate::metadata::{
ContextProviderExtension, DatabaseSet, CLUSTER_SCHEMA, COLUMNS_COLUMN_NAME,
is_system_database, ContextProviderExtension, DatabaseSet, COLUMNS_COLUMN_NAME,
COLUMNS_COLUMN_TYPE, COLUMNS_COMPRESSION_CODEC, COLUMNS_DATABASE_NAME, COLUMNS_DATA_TYPE,
COLUMNS_TABLE_NAME, DATABASES_DATABASE_NAME, DATABASES_PRECISION, DATABASES_REPLICA,
DATABASES_SHARD, DATABASES_TTL, DATABASES_VNODE_DURATION, INFORMATION_SCHEMA,
Expand Down Expand Up @@ -503,7 +503,7 @@ impl<'a, S: ContextProviderExtension + Send + Sync + 'a> SqlPlanner<'a, S> {
let (plan, privilege) = match obj_type {
TenantObjectType::Database => {
let database_name = normalize_ident(object_name);
if database_name.eq(DEFAULT_DATABASE) {
if is_system_database(tenant_name, &database_name) {
return Err(QueryError::ForbidDropDatabase {
name: database_name,
});
Expand Down Expand Up @@ -1230,11 +1230,7 @@ impl<'a, S: ContextProviderExtension + Send + Sync + 'a> SqlPlanner<'a, S> {
} = stmt;

let name = normalize_ident(name);

// check if system database
if name.eq_ignore_ascii_case(CLUSTER_SCHEMA)
|| name.eq_ignore_ascii_case(INFORMATION_SCHEMA)
{
if is_system_database(session.tenant(), name.as_str()) {
return Err(QueryError::Meta {
source: MetaError::DatabaseAlreadyExists { database: name },
});
Expand Down
24 changes: 24 additions & 0 deletions query_server/sqllogicaltests/cases/sys_table/system_database.slt
@@ -0,0 +1,24 @@
statement error
create database public;


statement error
create database cluster_schema;

statement error
create database information_schema;

statement error
create database usage_schema;

statement error
drop database public;

statement error
drop database cluster_schema;

statement error
drop database information_schema;

statement error
drop database usage_schema;

0 comments on commit 1e64aba

Please sign in to comment.