博客
如何为 Databened 添加新的系统表
PsiACE5月 6, 2023
Databend 的系统表位于 query/storage 目录下。当然,如果因为一些特殊的构建原因无法放在这个位置的话,也可以考虑临时放到
service/databases/system
系统表的定义主要关注两个内容:一个是表的信息,会包含表名、Schema 这些;另一个就是表中数据的生成/获取。刚好可以对应到
SyncSystemTable
AsyncSystemTable
get_table_info
get_full_data
实现
本文将会以
credits
首先,需要参考其他系统表的实现,去定义表对应的结构,只需要保有表信息的字段就可以了。
pub struct CreditsTable {
table_info: TableInfo,
}
接下来是为
CreditsTable
create
pub fn create(table_id: u64) -> Arc<dyn Table>
传入的
table_id
sys_db_meta.next_table_id()
schema
TableSchemaRefExt
TableField
let schema = TableSchemaRefExt::create(vec![
TableField::new("name", TableDataType::String),
TableField::new("version", TableDataType::String),
TableField::new("license", TableDataType::String),
]);
对于字符串类数据,可以使用
TableDataType::String
TableDataType::Nullable(Box::new(TableDataType::Number(NumberDataType::UInt64)))
TableDataType::Nullable
TableDataType::Number(NumberDataType::UInt64)
接下来就是定义表的信息,基本上只需要依葫芦画瓢,把描述、表名、元数据填上就好。
let table_info = TableInfo {
desc: "'system'.'credits'".to_string(),
name: "credits".to_string(),
ident: TableIdent::new(table_id, 0),
meta: TableMeta {
schema,
engine: "SystemCredits".to_string(),
..Default::default()
},
..Default::default()
};
SyncOneBlockSystemTable::create(CreditsTable { table_info })
对于同步类型的表往往使用
SyncOneBlockSystemTable
AsyncOneBlockSystemTable
接下来,则是实现
SyncSystemTable
SyncSystemTable
NAME
get_table_info
get_full_data
get_partitions
truncate
AsyncSystemTable
truncate
NAME
system.<name>
const NAME: &'static str = "system.credits";
get_table_info
fn get_table_info(&self) -> &TableInfo {
&self.table_info
}
get_full_data
credits
license
let licenses: Vec<Vec<u8>> = env!("DATABEND_CREDITS_LICENSES")
.split_terminator(',')
.map(|x| x.trim().as_bytes().to_vec())
.collect();
license