Skip to content

Commit

Permalink
Merge a3318a0 into f747534
Browse files Browse the repository at this point in the history
  • Loading branch information
andyrichardson committed Jul 28, 2022
2 parents f747534 + a3318a0 commit d92bd13
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/ast/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -883,6 +883,9 @@ pub enum Statement {
default_charset: Option<String>,
collation: Option<String>,
on_commit: Option<OnCommit>,
/// Click house "ON CLUSTER" clause:
/// <https://clickhouse.com/docs/en/sql-reference/distributed-ddl/>
on_cluster: Option<String>,
},
/// SQLite's `CREATE VIRTUAL TABLE .. USING <module_name> (<module_args>)`
CreateVirtualTable {
Expand Down Expand Up @@ -1509,6 +1512,7 @@ impl fmt::Display for Statement {
engine,
collation,
on_commit,
on_cluster,
} => {
// We want to allow the following options
// Empty column list, allowed by PostgreSQL:
Expand All @@ -1535,6 +1539,13 @@ impl fmt::Display for Statement {
temporary = if *temporary { "TEMPORARY " } else { "" },
name = name,
)?;
if let Some(on_cluster) = on_cluster {
write!(
f,
" ON CLUSTER {}",
on_cluster.replace('{', "'{").replace('}', "}'")
)?;
}
if !columns.is_empty() || !constraints.is_empty() {
write!(f, " ({}", display_comma_separated(columns))?;
if !columns.is_empty() && !constraints.is_empty() {
Expand Down
14 changes: 14 additions & 0 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1826,6 +1826,7 @@ impl<'a> Parser<'a> {
engine: None,
collation: None,
on_commit: None,
on_cluster: None,
})
}

Expand Down Expand Up @@ -2107,6 +2108,18 @@ impl<'a> Parser<'a> {
) -> Result<Statement, ParserError> {
let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
let table_name = self.parse_object_name()?;

// Clickhouse has `ON CLUSTER 'cluster'` syntax for DDLs
let on_cluster = if self.parse_keywords(&[Keyword::ON, Keyword::CLUSTER]) {
match self.next_token() {
Token::SingleQuotedString(s) => Some(s),
Token::Word(s) => Some(s.to_string()),
unexpected => self.expected("identifier or cluster literal", unexpected)?,
}
} else {
None
};

let like = if self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE) {
self.parse_object_name().ok()
} else {
Expand Down Expand Up @@ -2207,6 +2220,7 @@ impl<'a> Parser<'a> {
default_charset,
collation,
on_commit,
on_cluster,
})
}

Expand Down
21 changes: 21 additions & 0 deletions tests/sqlparser_common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1995,6 +1995,27 @@ fn parse_create_table_as() {
}
}

#[test]
fn parse_create_table_on_cluster() {
// Using single-quote literal to define current cluster
let sql = "CREATE TABLE t ON CLUSTER '{cluster}' (a INT, b INT)";
match verified_stmt(sql) {
Statement::CreateTable { on_cluster, .. } => {
assert_eq!(on_cluster.unwrap(), "{cluster}".to_string());
}
_ => unreachable!(),
}

// Using explicitly declared cluster name
let sql = "CREATE TABLE t ON CLUSTER my_cluster (a INT, b INT)";
match verified_stmt(sql) {
Statement::CreateTable { on_cluster, .. } => {
assert_eq!(on_cluster.unwrap(), "my_cluster".to_string());
}
_ => unreachable!(),
}
}

#[test]
fn parse_create_or_replace_table() {
let sql = "CREATE OR REPLACE TABLE t (a INT)";
Expand Down

0 comments on commit d92bd13

Please sign in to comment.