sql/statements/
describe.rsuse std::fmt::Display;
use sqlparser::ast::ObjectName;
use sqlparser_derive::{Visit, VisitMut};
#[derive(Debug, Clone, PartialEq, Eq, Visit, VisitMut)]
pub struct DescribeTable {
name: ObjectName,
}
impl DescribeTable {
pub fn new(name: ObjectName) -> Self {
Self { name }
}
pub fn name(&self) -> &ObjectName {
&self.name
}
}
impl Display for DescribeTable {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let name = self.name();
write!(f, r#"DESCRIBE TABLE {name}"#)
}
}
#[cfg(test)]
mod tests {
use std::assert_matches::assert_matches;
use crate::dialect::GreptimeDbDialect;
use crate::parser::{ParseOptions, ParserContext};
use crate::statements::statement::Statement;
use crate::util::format_raw_object_name;
#[test]
pub fn test_describe_table() {
let sql = "DESCRIBE TABLE test";
let stmts: Vec<Statement> =
ParserContext::create_with_dialect(sql, &GreptimeDbDialect {}, ParseOptions::default())
.unwrap();
assert_eq!(1, stmts.len());
assert_matches!(&stmts[0], Statement::DescribeTable { .. });
match &stmts[0] {
Statement::DescribeTable(show) => {
assert_eq!(format_raw_object_name(&show.name), "test");
}
_ => {
unreachable!();
}
}
}
#[test]
pub fn test_describe_schema_table() {
let sql = "DESCRIBE TABLE test_schema.test";
let stmts: Vec<Statement> =
ParserContext::create_with_dialect(sql, &GreptimeDbDialect {}, ParseOptions::default())
.unwrap();
assert_eq!(1, stmts.len());
assert_matches!(&stmts[0], Statement::DescribeTable { .. });
match &stmts[0] {
Statement::DescribeTable(show) => {
assert_eq!(format_raw_object_name(&show.name), "test_schema.test");
}
_ => {
unreachable!();
}
}
}
#[test]
pub fn test_describe_catalog_schema_table() {
let sql = "DESCRIBE TABLE test_catalog.test_schema.test";
let stmts: Vec<Statement> =
ParserContext::create_with_dialect(sql, &GreptimeDbDialect {}, ParseOptions::default())
.unwrap();
assert_eq!(1, stmts.len());
assert_matches!(&stmts[0], Statement::DescribeTable { .. });
match &stmts[0] {
Statement::DescribeTable(show) => {
assert_eq!(
format_raw_object_name(&show.name),
"test_catalog.test_schema.test"
);
}
_ => {
unreachable!();
}
}
}
#[test]
pub fn test_describe_missing_table_name() {
let sql = "DESCRIBE TABLE";
assert!(ParserContext::create_with_dialect(
sql,
&GreptimeDbDialect {},
ParseOptions::default()
)
.is_err());
}
#[test]
fn test_display_describe_table() {
let sql = r"describe table monitor;";
let stmts =
ParserContext::create_with_dialect(sql, &GreptimeDbDialect {}, ParseOptions::default())
.unwrap();
assert_eq!(1, stmts.len());
assert_matches!(&stmts[0], Statement::DescribeTable { .. });
match &stmts[0] {
Statement::DescribeTable(set) => {
let new_sql = format!("\n{}", set);
assert_eq!(
r#"
DESCRIBE TABLE monitor"#,
&new_sql
);
}
_ => {
unreachable!();
}
}
}
}