Skip to content

Commit e710836

Browse files
git-hulkayman-sigma
authored andcommitted
Fix AS query clause should be after the create table options (apache#1339)
1 parent 8fa9821 commit e710836

File tree

4 files changed

+61
-10
lines changed

4 files changed

+61
-10
lines changed

src/ast/dml.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -418,9 +418,6 @@ impl Display for CreateTable {
418418
write!(f, " WITH TAG ({})", display_comma_separated(tag.as_slice()))?;
419419
}
420420

421-
if let Some(query) = &self.query {
422-
write!(f, " AS {query}")?;
423-
}
424421
if let Some(default_charset) = &self.default_charset {
425422
write!(f, " DEFAULT CHARSET={default_charset}")?;
426423
}
@@ -440,6 +437,9 @@ impl Display for CreateTable {
440437
if self.strict {
441438
write!(f, " STRICT")?;
442439
}
440+
if let Some(query) = &self.query {
441+
write!(f, " AS {query}")?;
442+
}
443443
Ok(())
444444
}
445445
}

src/parser/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5432,13 +5432,6 @@ impl<'a> Parser<'a> {
54325432

54335433
let create_table_config = self.parse_optional_create_table_config()?;
54345434

5435-
// Parse optional `AS ( query )`
5436-
let query = if self.parse_keyword(Keyword::AS) {
5437-
Some(self.parse_boxed_query()?)
5438-
} else {
5439-
None
5440-
};
5441-
54425435
let default_charset = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
54435436
self.expect_token(&Token::Eq)?;
54445437
let next_token = self.next_token();
@@ -5491,6 +5484,13 @@ impl<'a> Parser<'a> {
54915484
None
54925485
};
54935486

5487+
// Parse optional `AS ( query )`
5488+
let query = if self.parse_keyword(Keyword::AS) {
5489+
Some(self.parse_boxed_query()?)
5490+
} else {
5491+
None
5492+
};
5493+
54945494
Ok(CreateTableBuilder::new(table_name)
54955495
.temporary(temporary)
54965496
.columns(columns)

tests/sqlparser_clickhouse.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,30 @@ fn test_query_with_format_clause() {
802802
}
803803
}
804804

805+
#[test]
806+
fn parse_create_table_on_commit_and_as_query() {
807+
let sql = r#"CREATE LOCAL TEMPORARY TABLE test ON COMMIT PRESERVE ROWS AS SELECT 1"#;
808+
match clickhouse_and_generic().verified_stmt(sql) {
809+
Statement::CreateTable(CreateTable {
810+
name,
811+
on_commit,
812+
query,
813+
..
814+
}) => {
815+
assert_eq!(name.to_string(), "test");
816+
assert_eq!(on_commit, Some(OnCommit::PreserveRows));
817+
assert_eq!(
818+
query.unwrap().body.as_select().unwrap().projection,
819+
vec![UnnamedExpr(Expr::Value(Value::Number(
820+
"1".parse().unwrap(),
821+
false
822+
)))]
823+
);
824+
}
825+
_ => unreachable!(),
826+
}
827+
}
828+
805829
fn clickhouse() -> TestedDialects {
806830
TestedDialects {
807831
dialects: vec![Box::new(ClickHouseDialect {})],

tests/sqlparser_mysql.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,33 @@ fn parse_create_table_collate() {
812812
}
813813
}
814814

815+
#[test]
816+
fn parse_create_table_both_options_and_as_query() {
817+
let sql = "CREATE TABLE foo (id INT(11)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb4_0900_ai_ci AS SELECT 1";
818+
match mysql_and_generic().verified_stmt(sql) {
819+
Statement::CreateTable(CreateTable {
820+
name,
821+
collation,
822+
query,
823+
..
824+
}) => {
825+
assert_eq!(name.to_string(), "foo");
826+
assert_eq!(collation, Some("utf8mb4_0900_ai_ci".to_string()));
827+
assert_eq!(
828+
query.unwrap().body.as_select().unwrap().projection,
829+
vec![SelectItem::UnnamedExpr(Expr::Value(number("1")))]
830+
);
831+
}
832+
_ => unreachable!(),
833+
}
834+
835+
let sql = r"CREATE TABLE foo (id INT(11)) ENGINE=InnoDB AS SELECT 1 DEFAULT CHARSET=utf8mb3";
836+
assert!(matches!(
837+
mysql_and_generic().parse_sql_statements(sql),
838+
Err(ParserError::ParserError(_))
839+
));
840+
}
841+
815842
#[test]
816843
fn parse_create_table_comment_character_set() {
817844
let sql = "CREATE TABLE foo (s TEXT CHARACTER SET utf8mb4 COMMENT 'comment')";

0 commit comments

Comments
 (0)