Skip to content

Commit 5363d4e

Browse files
authored
create table: add clone syntax (#542)
Signed-off-by: Maciej Obuchowski <[email protected]>
1 parent c2ccc80 commit 5363d4e

File tree

4 files changed

+30
-1
lines changed

4 files changed

+30
-1
lines changed

src/ast/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -863,6 +863,7 @@ pub enum Statement {
863863
query: Option<Box<Query>>,
864864
without_rowid: bool,
865865
like: Option<ObjectName>,
866+
clone: Option<ObjectName>,
866867
engine: Option<String>,
867868
default_charset: Option<String>,
868869
collation: Option<String>,
@@ -1484,6 +1485,7 @@ impl fmt::Display for Statement {
14841485
query,
14851486
without_rowid,
14861487
like,
1488+
clone,
14871489
default_charset,
14881490
engine,
14891491
collation,
@@ -1520,7 +1522,7 @@ impl fmt::Display for Statement {
15201522
write!(f, ", ")?;
15211523
}
15221524
write!(f, "{})", display_comma_separated(constraints))?;
1523-
} else if query.is_none() && like.is_none() {
1525+
} else if query.is_none() && like.is_none() && clone.is_none() {
15241526
// PostgreSQL allows `CREATE TABLE t ();`, but requires empty parens
15251527
write!(f, " ()")?;
15261528
}
@@ -1533,6 +1535,11 @@ impl fmt::Display for Statement {
15331535
if let Some(l) = like {
15341536
write!(f, " LIKE {}", l)?;
15351537
}
1538+
1539+
if let Some(c) = clone {
1540+
write!(f, " CLONE {}", c)?;
1541+
}
1542+
15361543
match hive_distribution {
15371544
HiveDistributionStyle::PARTITIONED { columns } => {
15381545
write!(f, " PARTITIONED BY ({})", display_comma_separated(columns))?;

src/keywords.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ define_keywords!(
126126
CHAR_LENGTH,
127127
CHECK,
128128
CLOB,
129+
CLONE,
129130
CLOSE,
130131
CLUSTER,
131132
COALESCE,

src/parser.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,6 +1774,7 @@ impl<'a> Parser<'a> {
17741774
query: None,
17751775
without_rowid: false,
17761776
like: None,
1777+
clone: None,
17771778
default_charset: None,
17781779
engine: None,
17791780
collation: None,
@@ -2064,6 +2065,13 @@ impl<'a> Parser<'a> {
20642065
} else {
20652066
None
20662067
};
2068+
2069+
let clone = if self.parse_keyword(Keyword::CLONE) {
2070+
self.parse_object_name().ok()
2071+
} else {
2072+
None
2073+
};
2074+
20672075
// parse optional column list (schema)
20682076
let (columns, constraints) = self.parse_columns()?;
20692077

@@ -2147,6 +2155,7 @@ impl<'a> Parser<'a> {
21472155
query,
21482156
without_rowid,
21492157
like,
2158+
clone,
21502159
engine,
21512160
default_charset,
21522161
collation,

tests/sqlparser_common.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1992,6 +1992,18 @@ fn parse_create_table_with_options() {
19921992
}
19931993
}
19941994

1995+
#[test]
1996+
fn parse_create_table_clone() {
1997+
let sql = "CREATE OR REPLACE TABLE a CLONE a_tmp";
1998+
match verified_stmt(sql) {
1999+
Statement::CreateTable { name, clone, .. } => {
2000+
assert_eq!(ObjectName(vec![Ident::new("a")]), name);
2001+
assert_eq!(Some(ObjectName(vec![(Ident::new("a_tmp"))])), clone)
2002+
}
2003+
_ => unreachable!(),
2004+
}
2005+
}
2006+
19952007
#[test]
19962008
fn parse_create_table_trailing_comma() {
19972009
let sql = "CREATE TABLE foo (bar int,)";

0 commit comments

Comments
 (0)