feat: support show views statement (#4360)

This commit enables show view statement which will display a list of views
names.
This commit is contained in:
Lanqing Yang
2024-07-15 00:24:27 -07:00
committed by GitHub
parent b8bd8456f0
commit 9501318ce5
9 changed files with 198 additions and 4 deletions

View File

@@ -22,7 +22,7 @@ use crate::error::{
use crate::parser::ParserContext;
use crate::statements::show::{
ShowColumns, ShowCreateFlow, ShowCreateTable, ShowCreateView, ShowDatabases, ShowIndex,
ShowKind, ShowStatus, ShowTableStatus, ShowTables, ShowVariables,
ShowKind, ShowStatus, ShowTableStatus, ShowTables, ShowVariables, ShowViews,
};
use crate::statements::statement::Statement;
@@ -44,6 +44,8 @@ impl<'a> ParserContext<'a> {
} else {
self.unsupported(self.peek_token_as_string())
}
} else if self.consume_token("VIEWS") {
self.parse_show_views()
} else if self.matches_keyword(Keyword::CHARSET) {
self.parser.next_token();
Ok(Statement::ShowCharset(self.parse_show_kind()?))
@@ -430,6 +432,28 @@ impl<'a> ParserContext<'a> {
_ => self.unsupported(self.peek_token_as_string()),
}
}
fn parse_show_views(&mut self) -> Result<Statement> {
let database = match self.parser.peek_token().token {
Token::EOF | Token::SemiColon => {
return Ok(Statement::ShowViews(ShowViews {
kind: ShowKind::All,
database: None,
}));
}
// SHOW VIEWS [in | FROM] [DATABASE]
Token::Word(w) => match w.keyword {
Keyword::IN | Keyword::FROM => self.parse_db_name()?,
_ => None,
},
_ => None,
};
let kind = self.parse_show_kind()?;
Ok(Statement::ShowViews(ShowViews { kind, database }))
}
}
#[cfg(test)]
@@ -942,4 +966,38 @@ mod tests {
);
assert_eq!(sql, stmts[0].to_string());
}
#[test]
pub fn test_show_views() {
let sql = "SHOW VIEWS";
let result =
ParserContext::create_with_dialect(sql, &GreptimeDbDialect {}, ParseOptions::default());
let stmts = result.unwrap();
assert_eq!(1, stmts.len());
assert_eq!(
stmts[0],
Statement::ShowViews(ShowViews {
kind: ShowKind::All,
database: None,
})
);
assert_eq!(sql, stmts[0].to_string());
}
#[test]
pub fn test_show_views_in_db() {
let sql = "SHOW VIEWS IN d1";
let result =
ParserContext::create_with_dialect(sql, &GreptimeDbDialect {}, ParseOptions::default());
let stmts = result.unwrap();
assert_eq!(1, stmts.len());
assert_eq!(
stmts[0],
Statement::ShowViews(ShowViews {
kind: ShowKind::All,
database: Some("d1".to_string()),
})
);
assert_eq!(sql, stmts[0].to_string());
}
}

View File

@@ -200,6 +200,25 @@ impl Display for ShowCreateView {
}
}
/// SQL structure for `SHOW VIEWS`.
#[derive(Debug, Clone, PartialEq, Eq, Visit, VisitMut)]
pub struct ShowViews {
pub kind: ShowKind,
pub database: Option<String>,
}
impl Display for ShowViews {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "SHOW VIEWS")?;
if let Some(database) = &self.database {
write!(f, " IN {database}")?;
}
format_kind!(self, f);
Ok(())
}
}
/// SQL structure for `SHOW VARIABLES xxx`.
#[derive(Debug, Clone, PartialEq, Eq, Visit, VisitMut)]
pub struct ShowVariables {
@@ -473,6 +492,49 @@ SHOW FULL TABLES"#,
}
}
#[test]
fn test_display_show_views() {
let sql = r"show views in d1;";
let stmts: Vec<Statement> =
ParserContext::create_with_dialect(sql, &GreptimeDbDialect {}, ParseOptions::default())
.unwrap();
assert_eq!(1, stmts.len());
assert_matches!(&stmts[0], Statement::ShowViews { .. });
match &stmts[0] {
Statement::ShowViews(show) => {
let new_sql = format!("\n{}", show);
assert_eq!(
r#"
SHOW VIEWS IN d1"#,
&new_sql
);
}
_ => {
unreachable!();
}
}
let sql = r"show views;";
let stmts: Vec<Statement> =
ParserContext::create_with_dialect(sql, &GreptimeDbDialect {}, ParseOptions::default())
.unwrap();
assert_eq!(1, stmts.len());
assert_matches!(&stmts[0], Statement::ShowViews { .. });
match &stmts[0] {
Statement::ShowViews(show) => {
let new_sql = format!("\n{}", show);
assert_eq!(
r#"
SHOW VIEWS"#,
&new_sql
);
}
_ => {
unreachable!();
}
}
}
#[test]
fn test_display_show_databases() {
let sql = r"show databases;";

View File

@@ -32,7 +32,7 @@ use crate::statements::query::Query;
use crate::statements::set_variables::SetVariables;
use crate::statements::show::{
ShowColumns, ShowCreateFlow, ShowCreateTable, ShowCreateView, ShowDatabases, ShowIndex,
ShowKind, ShowStatus, ShowTableStatus, ShowTables, ShowVariables,
ShowKind, ShowStatus, ShowTableStatus, ShowTables, ShowVariables, ShowViews,
};
use crate::statements::tql::Tql;
use crate::statements::truncate::TruncateTable;
@@ -91,6 +91,8 @@ pub enum Statement {
ShowCreateView(ShowCreateView),
// SHOW STATUS
ShowStatus(ShowStatus),
// SHOW VIEWS
ShowViews(ShowViews),
// DESCRIBE TABLE
DescribeTable(DescribeTable),
// EXPLAIN QUERY
@@ -132,6 +134,7 @@ impl Display for Statement {
Statement::ShowCreateTable(s) => s.fmt(f),
Statement::ShowCreateFlow(s) => s.fmt(f),
Statement::ShowCreateView(s) => s.fmt(f),
Statement::ShowViews(s) => s.fmt(f),
Statement::ShowStatus(s) => s.fmt(f),
Statement::DescribeTable(s) => s.fmt(f),
Statement::Explain(s) => s.fmt(f),