use glaredb_error::Result;
use super::create::{
CreateAggregateFunctionInfo,
CreateScalarFunctionInfo,
CreateSchemaInfo,
CreateTableFunctionInfo,
CreateViewInfo,
OnConflict,
};
use super::memory::MemoryCatalog;
use super::{Catalog, Schema};
use crate::functions::aggregate::builtin::BUILTIN_AGGREGATE_FUNCTION_SETS;
use crate::functions::scalar::builtin::BUILTIN_SCALAR_FUNCTION_SETS;
use crate::functions::table::builtin::BUILTIN_TABLE_FUNCTION_SETS;
pub const DEFAULT_SCHEMA: &str = "default";
pub fn new_system_catalog() -> Result<MemoryCatalog> {
let catalog = MemoryCatalog::empty();
let builtin = catalog.create_schema(&CreateSchemaInfo {
name: DEFAULT_SCHEMA.to_string(),
on_conflict: OnConflict::Error,
})?;
let _pg_catalog = catalog.create_schema(&CreateSchemaInfo {
name: "pg_catalog".to_string(),
on_conflict: OnConflict::Error,
})?;
let _information_schema_catalog = catalog.create_schema(&CreateSchemaInfo {
name: "information_schema".to_string(),
on_conflict: OnConflict::Error,
})?;
for func in BUILTIN_SCALAR_FUNCTION_SETS.iter() {
builtin.create_scalar_function(&CreateScalarFunctionInfo {
name: func.name.to_string(),
implementation: func,
on_conflict: OnConflict::Error,
})?;
for alias in func.aliases {
builtin.create_scalar_function(&CreateScalarFunctionInfo {
name: alias.to_string(),
implementation: func,
on_conflict: OnConflict::Error,
})?;
}
}
for func in BUILTIN_AGGREGATE_FUNCTION_SETS.iter() {
builtin.create_aggregate_function(&CreateAggregateFunctionInfo {
name: func.name.to_string(),
implementation: func,
on_conflict: OnConflict::Error,
})?;
for alias in func.aliases {
builtin.create_aggregate_function(&CreateAggregateFunctionInfo {
name: alias.to_string(),
implementation: func,
on_conflict: OnConflict::Error,
})?;
}
}
for func in BUILTIN_TABLE_FUNCTION_SETS.iter() {
builtin.create_table_function(&CreateTableFunctionInfo {
name: func.name.to_string(),
implementation: func,
infer_scan: None,
on_conflict: OnConflict::Error,
})?;
for alias in func.aliases {
builtin.create_table_function(&CreateTableFunctionInfo {
name: alias.to_string(),
implementation: func,
infer_scan: None,
on_conflict: OnConflict::Error,
})?;
}
}
for view in BUILTIN_VIEWS {
builtin.create_view(&CreateViewInfo {
name: view.name.to_string(),
column_aliases: None,
on_conflict: OnConflict::Error,
query_string: view.view.to_string(),
})?;
}
Ok(catalog)
}
pub const BUILTIN_VIEWS: &[BuiltinView] =
&[SHOW_DATABASES_VIEW, SHOW_SCHEMAS_VIEW, SHOW_TABLES_VIEW];
#[derive(Debug)]
pub struct BuiltinView {
pub name: &'static str,
pub view: &'static str,
}
pub const SHOW_DATABASES_VIEW: BuiltinView = BuiltinView {
name: "show_databases",
view: "
SELECT database_name
FROM list_databases()
ORDER BY database_name;
",
};
pub const SHOW_SCHEMAS_VIEW: BuiltinView = BuiltinView {
name: "show_schemas",
view: "
SELECT schema_name
FROM list_schemas()
ORDER BY schema_name;
",
};
pub const SHOW_TABLES_VIEW: BuiltinView = BuiltinView {
name: "show_tables",
view: "
WITH tables AS (
SELECT table_name AS name
FROM list_tables()
), views AS (
SELECT view_name AS name
FROM list_views()
), views_and_tables AS (
SELECT * FROM tables UNION ALL SELECT * FROM views
)
SELECT name
FROM views_and_tables
ORDER BY name;
",
};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn creates_without_error() {
new_system_catalog().unwrap();
}
}