mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-09-20 12:49:47 +00:00
Fix AS query clause should be after the create table options (#1339)
This commit is contained in:
parent
993216f3ac
commit
20f7ac59e3
4 changed files with 61 additions and 10 deletions
|
@ -418,9 +418,6 @@ impl Display for CreateTable {
|
||||||
write!(f, " WITH TAG ({})", display_comma_separated(tag.as_slice()))?;
|
write!(f, " WITH TAG ({})", display_comma_separated(tag.as_slice()))?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(query) = &self.query {
|
|
||||||
write!(f, " AS {query}")?;
|
|
||||||
}
|
|
||||||
if let Some(default_charset) = &self.default_charset {
|
if let Some(default_charset) = &self.default_charset {
|
||||||
write!(f, " DEFAULT CHARSET={default_charset}")?;
|
write!(f, " DEFAULT CHARSET={default_charset}")?;
|
||||||
}
|
}
|
||||||
|
@ -440,6 +437,9 @@ impl Display for CreateTable {
|
||||||
if self.strict {
|
if self.strict {
|
||||||
write!(f, " STRICT")?;
|
write!(f, " STRICT")?;
|
||||||
}
|
}
|
||||||
|
if let Some(query) = &self.query {
|
||||||
|
write!(f, " AS {query}")?;
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5418,13 +5418,6 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
let create_table_config = self.parse_optional_create_table_config()?;
|
let create_table_config = self.parse_optional_create_table_config()?;
|
||||||
|
|
||||||
// Parse optional `AS ( query )`
|
|
||||||
let query = if self.parse_keyword(Keyword::AS) {
|
|
||||||
Some(self.parse_boxed_query()?)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
};
|
|
||||||
|
|
||||||
let default_charset = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
|
let default_charset = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
|
||||||
self.expect_token(&Token::Eq)?;
|
self.expect_token(&Token::Eq)?;
|
||||||
let next_token = self.next_token();
|
let next_token = self.next_token();
|
||||||
|
@ -5477,6 +5470,13 @@ impl<'a> Parser<'a> {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Parse optional `AS ( query )`
|
||||||
|
let query = if self.parse_keyword(Keyword::AS) {
|
||||||
|
Some(self.parse_boxed_query()?)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
Ok(CreateTableBuilder::new(table_name)
|
Ok(CreateTableBuilder::new(table_name)
|
||||||
.temporary(temporary)
|
.temporary(temporary)
|
||||||
.columns(columns)
|
.columns(columns)
|
||||||
|
|
|
@ -802,6 +802,30 @@ fn test_query_with_format_clause() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_create_table_on_commit_and_as_query() {
|
||||||
|
let sql = r#"CREATE LOCAL TEMPORARY TABLE test ON COMMIT PRESERVE ROWS AS SELECT 1"#;
|
||||||
|
match clickhouse_and_generic().verified_stmt(sql) {
|
||||||
|
Statement::CreateTable(CreateTable {
|
||||||
|
name,
|
||||||
|
on_commit,
|
||||||
|
query,
|
||||||
|
..
|
||||||
|
}) => {
|
||||||
|
assert_eq!(name.to_string(), "test");
|
||||||
|
assert_eq!(on_commit, Some(OnCommit::PreserveRows));
|
||||||
|
assert_eq!(
|
||||||
|
query.unwrap().body.as_select().unwrap().projection,
|
||||||
|
vec![UnnamedExpr(Expr::Value(Value::Number(
|
||||||
|
"1".parse().unwrap(),
|
||||||
|
false
|
||||||
|
)))]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn clickhouse() -> TestedDialects {
|
fn clickhouse() -> TestedDialects {
|
||||||
TestedDialects {
|
TestedDialects {
|
||||||
dialects: vec![Box::new(ClickHouseDialect {})],
|
dialects: vec![Box::new(ClickHouseDialect {})],
|
||||||
|
|
|
@ -812,6 +812,33 @@ fn parse_create_table_collate() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_create_table_both_options_and_as_query() {
|
||||||
|
let sql = "CREATE TABLE foo (id INT(11)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb4_0900_ai_ci AS SELECT 1";
|
||||||
|
match mysql_and_generic().verified_stmt(sql) {
|
||||||
|
Statement::CreateTable(CreateTable {
|
||||||
|
name,
|
||||||
|
collation,
|
||||||
|
query,
|
||||||
|
..
|
||||||
|
}) => {
|
||||||
|
assert_eq!(name.to_string(), "foo");
|
||||||
|
assert_eq!(collation, Some("utf8mb4_0900_ai_ci".to_string()));
|
||||||
|
assert_eq!(
|
||||||
|
query.unwrap().body.as_select().unwrap().projection,
|
||||||
|
vec![SelectItem::UnnamedExpr(Expr::Value(number("1")))]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
|
||||||
|
let sql = r"CREATE TABLE foo (id INT(11)) ENGINE=InnoDB AS SELECT 1 DEFAULT CHARSET=utf8mb3";
|
||||||
|
assert!(matches!(
|
||||||
|
mysql_and_generic().parse_sql_statements(sql),
|
||||||
|
Err(ParserError::ParserError(_))
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_create_table_comment_character_set() {
|
fn parse_create_table_comment_character_set() {
|
||||||
let sql = "CREATE TABLE foo (s TEXT CHARACTER SET utf8mb4 COMMENT 'comment')";
|
let sql = "CREATE TABLE foo (s TEXT CHARACTER SET utf8mb4 COMMENT 'comment')";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue