Skip to content

Commit 407003a

Browse files
committed
Code review comments, also added support for materialized views
1 parent febab0b commit 407003a

File tree

5 files changed

+95
-77
lines changed

5 files changed

+95
-77
lines changed

src/ast/mod.rs

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,8 @@ pub use self::value::{
7373
TrimWhereField, Value,
7474
};
7575

76-
use crate::{
77-
ast::helpers::stmt_data_loading::{DataLoadingOptions, StageLoadSelectItem, StageParamsObject},
78-
keywords::Keyword,
76+
use crate::ast::helpers::stmt_data_loading::{
77+
DataLoadingOptions, StageLoadSelectItem, StageParamsObject,
7978
};
8079
#[cfg(feature = "visitor")]
8180
pub use visitor::*;
@@ -2785,28 +2784,27 @@ pub enum Statement {
27852784
/// ```sql
27862785
/// SHOW DATABASES [LIKE 'pattern']
27872786
/// ```
2788-
ShowDatabases { pattern: Option<String> },
2787+
ShowDatabases { filter: Option<ShowStatementFilter> },
27892788
/// ```sql
27902789
/// SHOW SCHEMAS [LIKE 'pattern']
27912790
/// ```
2792-
ShowSchemas { pattern: Option<String> },
2791+
ShowSchemas { filter: Option<ShowStatementFilter> },
27932792
/// ```sql
27942793
/// SHOW TABLES
27952794
/// ```
27962795
ShowTables {
27972796
extended: bool,
27982797
full: bool,
2799-
// The keyword used to indicate the DB name (IN/FROM)
2800-
db_name_keyword: Option<Keyword>,
2798+
clause: Option<ShowClause>,
28012799
db_name: Option<Ident>,
28022800
filter: Option<ShowStatementFilter>,
28032801
},
28042802
/// ```sql
28052803
/// SHOW VIEWS
28062804
/// ```
28072805
ShowViews {
2808-
// The keyword used to indicate the DB name (IN/FROM)
2809-
db_name_keyword: Option<Keyword>,
2806+
materialized: bool,
2807+
clause: Option<ShowClause>,
28102808
db_name: Option<Ident>,
28112809
filter: Option<ShowStatementFilter>,
28122810
},
@@ -4382,24 +4380,24 @@ impl fmt::Display for Statement {
43824380
}
43834381
Ok(())
43844382
}
4385-
Statement::ShowDatabases { pattern } => {
4383+
Statement::ShowDatabases { filter } => {
43864384
write!(f, "SHOW DATABASES")?;
4387-
if let Some(pattern) = pattern {
4388-
write!(f, " LIKE '{}'", pattern)?;
4385+
if let Some(filter) = filter {
4386+
write!(f, " {filter}")?;
43894387
}
43904388
Ok(())
43914389
}
4392-
Statement::ShowSchemas { pattern } => {
4390+
Statement::ShowSchemas { filter } => {
43934391
write!(f, "SHOW SCHEMAS")?;
4394-
if let Some(pattern) = pattern {
4395-
write!(f, " LIKE '{}'", pattern)?;
4392+
if let Some(filter) = filter {
4393+
write!(f, " {filter}")?;
43964394
}
43974395
Ok(())
43984396
}
43994397
Statement::ShowTables {
44004398
extended,
44014399
full,
4402-
db_name_keyword,
4400+
clause: show_clause,
44034401
db_name,
44044402
filter,
44054403
} => {
@@ -4409,32 +4407,29 @@ impl fmt::Display for Statement {
44094407
extended = if *extended { "EXTENDED " } else { "" },
44104408
full = if *full { "FULL " } else { "" },
44114409
)?;
4410+
if let Some(show_clause) = show_clause {
4411+
write!(f, " {show_clause}")?;
4412+
}
44124413
if let Some(db_name) = db_name {
4413-
let keyword = match &db_name_keyword {
4414-
Some(Keyword::FROM) => "FROM",
4415-
Some(Keyword::IN) => "IN",
4416-
_ => unreachable!(),
4417-
};
4418-
write!(f, " {} {db_name}", keyword)?;
4414+
write!(f, " {db_name}")?;
44194415
}
44204416
if let Some(filter) = filter {
44214417
write!(f, " {filter}")?;
44224418
}
44234419
Ok(())
44244420
}
44254421
Statement::ShowViews {
4426-
db_name_keyword,
4422+
materialized,
4423+
clause: show_clause,
44274424
db_name,
44284425
filter,
44294426
} => {
4430-
write!(f, "SHOW VIEWS")?;
4427+
write!(f, "SHOW {}VIEWS", if *materialized { "MATERIALIZED " } else { "" })?;
4428+
if let Some(show_clause) = show_clause {
4429+
write!(f, " {show_clause}")?;
4430+
}
44314431
if let Some(db_name) = db_name {
4432-
let keyword = match &db_name_keyword {
4433-
Some(Keyword::FROM) => "FROM",
4434-
Some(Keyword::IN) => "IN",
4435-
_ => unreachable!(),
4436-
};
4437-
write!(f, " {} {db_name}", keyword)?;
4432+
write!(f, " {db_name}")?;
44384433
}
44394434
if let Some(filter) = filter {
44404435
write!(f, " {filter}")?;
@@ -6130,6 +6125,24 @@ impl fmt::Display for ShowStatementFilter {
61306125
}
61316126
}
61326127

6128+
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
6129+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
6130+
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
6131+
pub enum ShowClause {
6132+
IN,
6133+
FROM,
6134+
}
6135+
6136+
impl fmt::Display for ShowClause {
6137+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
6138+
use ShowClause::*;
6139+
match self {
6140+
FROM => write!(f, "FROM"),
6141+
IN => write!(f, "IN"),
6142+
}
6143+
}
6144+
}
6145+
61336146
/// Sqlite specific syntax
61346147
///
61356148
/// See [Sqlite documentation](https://sqlite.org/lang_conflict.html)

src/parser/mod.rs

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9579,8 +9579,10 @@ impl<'a> Parser<'a> {
95799579
Ok(self.parse_show_columns(extended, full)?)
95809580
} else if self.parse_keyword(Keyword::TABLES) {
95819581
Ok(self.parse_show_tables(extended, full)?)
9582+
} else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEWS]) {
9583+
Ok(self.parse_show_views(true)?)
95829584
} else if self.parse_keyword(Keyword::VIEWS) {
9583-
Ok(self.parse_show_views()?)
9585+
Ok(self.parse_show_views(false)?)
95849586
} else if self.parse_keyword(Keyword::FUNCTIONS) {
95859587
Ok(self.parse_show_functions()?)
95869588
} else if extended || full {
@@ -9619,21 +9621,15 @@ impl<'a> Parser<'a> {
96199621
}
96209622

96219623
fn parse_show_databases(&mut self) -> Result<Statement, ParserError> {
9622-
let pattern = if self.parse_keyword(Keyword::LIKE) {
9623-
Some(self.parse_literal_string()?)
9624-
} else {
9625-
None
9626-
};
9627-
Ok(Statement::ShowDatabases { pattern })
9624+
Ok(Statement::ShowDatabases {
9625+
filter: self.parse_show_statement_filter()?,
9626+
})
96289627
}
96299628

96309629
fn parse_show_schemas(&mut self) -> Result<Statement, ParserError> {
9631-
let pattern = if self.parse_keyword(Keyword::LIKE) {
9632-
Some(self.parse_literal_string()?)
9633-
} else {
9634-
None
9635-
};
9636-
Ok(Statement::ShowSchemas { pattern })
9630+
Ok(Statement::ShowSchemas {
9631+
filter: self.parse_show_statement_filter()?,
9632+
})
96379633
}
96389634

96399635
pub fn parse_show_create(&mut self) -> Result<Statement, ParserError> {
@@ -9691,30 +9687,33 @@ impl<'a> Parser<'a> {
96919687
extended: bool,
96929688
full: bool,
96939689
) -> Result<Statement, ParserError> {
9694-
let (db_name_keyword, db_name) =
9695-
match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
9696-
Some(keyword) => (Some(keyword), Some(self.parse_identifier(false)?)),
9697-
None => (None, None),
9698-
};
9690+
let (clause, db_name) = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN])
9691+
{
9692+
Some(Keyword::FROM) => (Some(ShowClause::FROM), Some(self.parse_identifier(false)?)),
9693+
Some(Keyword::IN) => (Some(ShowClause::IN), Some(self.parse_identifier(false)?)),
9694+
_ => (None, None),
9695+
};
96999696
let filter = self.parse_show_statement_filter()?;
97009697
Ok(Statement::ShowTables {
97019698
extended,
97029699
full,
9703-
db_name_keyword,
9700+
clause,
97049701
db_name,
97059702
filter,
97069703
})
97079704
}
97089705

9709-
fn parse_show_views(&mut self) -> Result<Statement, ParserError> {
9710-
let (db_name_keyword, db_name) =
9711-
match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN]) {
9712-
Some(keyword) => (Some(keyword), Some(self.parse_identifier(false)?)),
9713-
None => (None, None),
9714-
};
9706+
fn parse_show_views(&mut self, materialized: bool) -> Result<Statement, ParserError> {
9707+
let (clause, db_name) = match self.parse_one_of_keywords(&[Keyword::FROM, Keyword::IN])
9708+
{
9709+
Some(Keyword::FROM) => (Some(ShowClause::FROM), Some(self.parse_identifier(false)?)),
9710+
Some(Keyword::IN) => (Some(ShowClause::IN), Some(self.parse_identifier(false)?)),
9711+
_ => (None, None),
9712+
};
97159713
let filter = self.parse_show_statement_filter()?;
97169714
Ok(Statement::ShowViews {
9717-
db_name_keyword,
9715+
materialized,
9716+
clause,
97189717
db_name,
97199718
filter,
97209719
})

tests/sqlparser_common.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11378,3 +11378,24 @@ fn test_try_convert() {
1137811378
all_dialects_where(|d| d.supports_try_convert() && !d.convert_type_before_value());
1137911379
dialects.verified_expr("TRY_CONVERT('foo', VARCHAR(MAX))");
1138011380
}
11381+
11382+
#[test]
11383+
fn test_show_dbs_schemas_tables_views() {
11384+
verified_stmt("SHOW DATABASES");
11385+
verified_stmt("SHOW DATABASES LIKE '%abc'");
11386+
verified_stmt("SHOW SCHEMAS");
11387+
verified_stmt("SHOW SCHEMAS LIKE '%abc'");
11388+
verified_stmt("SHOW TABLES");
11389+
verified_stmt("SHOW TABLES IN db1");
11390+
verified_stmt("SHOW TABLES IN db1 'abc'");
11391+
verified_stmt("SHOW VIEWS");
11392+
verified_stmt("SHOW VIEWS IN db1");
11393+
verified_stmt("SHOW VIEWS IN db1 'abc'");
11394+
verified_stmt("SHOW VIEWS FROM db1");
11395+
verified_stmt("SHOW VIEWS FROM db1 'abc'");
11396+
verified_stmt("SHOW MATERIALIZED VIEWS");
11397+
verified_stmt("SHOW MATERIALIZED VIEWS IN db1");
11398+
verified_stmt("SHOW MATERIALIZED VIEWS IN db1 'abc'");
11399+
verified_stmt("SHOW MATERIALIZED VIEWS FROM db1");
11400+
verified_stmt("SHOW MATERIALIZED VIEWS FROM db1 'abc'");
11401+
}

tests/sqlparser_hive.rs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -534,20 +534,6 @@ fn parse_use() {
534534
);
535535
}
536536

537-
#[test]
538-
fn test_show() {
539-
hive_and_generic().verified_stmt("SHOW DATABASES");
540-
hive_and_generic().verified_stmt("SHOW DATABASES LIKE '%abc'");
541-
hive_and_generic().verified_stmt("SHOW SCHEMAS");
542-
hive_and_generic().verified_stmt("SHOW SCHEMAS LIKE '%abc'");
543-
hive_and_generic().verified_stmt("SHOW TABLES");
544-
hive_and_generic().verified_stmt("SHOW TABLES IN db1");
545-
hive_and_generic().verified_stmt("SHOW TABLES IN db1 'abc'");
546-
hive_and_generic().verified_stmt("SHOW VIEWS");
547-
hive_and_generic().verified_stmt("SHOW VIEWS IN db1");
548-
hive_and_generic().verified_stmt("SHOW VIEWS IN db1 'abc'");
549-
}
550-
551537
fn hive() -> TestedDialects {
552538
TestedDialects::new(vec![Box::new(HiveDialect {})])
553539
}

tests/sqlparser_mysql.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ use matches::assert_matches;
2424
use sqlparser::ast::MysqlInsertPriority::{Delayed, HighPriority, LowPriority};
2525
use sqlparser::ast::*;
2626
use sqlparser::dialect::{GenericDialect, MySqlDialect};
27-
use sqlparser::keywords::Keyword;
2827
use sqlparser::parser::{ParserError, ParserOptions};
2928
use sqlparser::tokenizer::Token;
3029
use test_utils::*;
@@ -330,7 +329,7 @@ fn parse_show_tables() {
330329
Statement::ShowTables {
331330
extended: false,
332331
full: false,
333-
db_name_keyword: None,
332+
clause: None,
334333
db_name: None,
335334
filter: None,
336335
}
@@ -340,7 +339,7 @@ fn parse_show_tables() {
340339
Statement::ShowTables {
341340
extended: false,
342341
full: false,
343-
db_name_keyword: Some(Keyword::FROM),
342+
clause: Some(ShowClause::FROM),
344343
db_name: Some(Ident::new("mydb")),
345344
filter: None,
346345
}
@@ -350,7 +349,7 @@ fn parse_show_tables() {
350349
Statement::ShowTables {
351350
extended: true,
352351
full: false,
353-
db_name_keyword: None,
352+
clause: None,
354353
db_name: None,
355354
filter: None,
356355
}
@@ -360,7 +359,7 @@ fn parse_show_tables() {
360359
Statement::ShowTables {
361360
extended: false,
362361
full: true,
363-
db_name_keyword: None,
362+
clause: None,
364363
db_name: None,
365364
filter: None,
366365
}
@@ -370,7 +369,7 @@ fn parse_show_tables() {
370369
Statement::ShowTables {
371370
extended: false,
372371
full: false,
373-
db_name_keyword: None,
372+
clause: None,
374373
db_name: None,
375374
filter: Some(ShowStatementFilter::Like("pattern".into())),
376375
}
@@ -380,7 +379,7 @@ fn parse_show_tables() {
380379
Statement::ShowTables {
381380
extended: false,
382381
full: false,
383-
db_name_keyword: None,
382+
clause: None,
384383
db_name: None,
385384
filter: Some(ShowStatementFilter::Where(
386385
mysql_and_generic().verified_expr("1 = 2")

0 commit comments

Comments
 (0)