Gate unparenthesized CREATE TABLE LIKE behind a dialect capability
diff --git a/src/dialect/bigquery.rs b/src/dialect/bigquery.rs index d34be9a..0e8bff1 100644 --- a/src/dialect/bigquery.rs +++ b/src/dialect/bigquery.rs
@@ -179,4 +179,9 @@ fn supports_comma_separated_trim(&self) -> bool { true } + + /// See <https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_table_like> + fn supports_create_table_like_plain(&self) -> bool { + true + } }
diff --git a/src/dialect/databricks.rs b/src/dialect/databricks.rs index ca8610d..aa760c7 100644 --- a/src/dialect/databricks.rs +++ b/src/dialect/databricks.rs
@@ -137,4 +137,9 @@ fn supports_pipe_operator(&self) -> bool { true } + + /// See <https://docs.databricks.com/aws/en/sql/language-manual/sql-ref-syntax-ddl-create-table-like> + fn supports_create_table_like_plain(&self) -> bool { + true + } }
diff --git a/src/dialect/generic.rs b/src/dialect/generic.rs index 09a5518..14826d0 100644 --- a/src/dialect/generic.rs +++ b/src/dialect/generic.rs
@@ -332,4 +332,8 @@ fn supports_alter_column_position(&self) -> bool { true } + + fn supports_create_table_like_plain(&self) -> bool { + true + } }
diff --git a/src/dialect/hive.rs b/src/dialect/hive.rs index 1a26f56..7b6a9ee 100644 --- a/src/dialect/hive.rs +++ b/src/dialect/hive.rs
@@ -89,4 +89,9 @@ fn supports_map_literal_with_angle_brackets(&self) -> bool { true } + + /// See <https://hive.apache.org/docs/latest/language/languagemanual-ddl/> + fn supports_create_table_like_plain(&self) -> bool { + true + } }
diff --git a/src/dialect/mod.rs b/src/dialect/mod.rs index 2beb565..38f2c26 100644 --- a/src/dialect/mod.rs +++ b/src/dialect/mod.rs
@@ -1644,17 +1644,14 @@ false } + /// Returns true if the dialect supports `CREATE TABLE new LIKE old`, without parentheses. + fn supports_create_table_like_plain(&self) -> bool { + false + } + /// Returns true if the dialect supports specifying which table to copy /// the schema from inside parenthesis. /// - /// Not parenthesized: - /// '''sql - /// CREATE TABLE new LIKE old ... - /// ''' - /// [Snowflake](https://docs.snowflake.com/en/sql-reference/sql/create-table#label-create-table-like) - /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_table_like) - /// - /// Parenthesized: /// '''sql /// CREATE TABLE new (LIKE old ...) /// '''
diff --git a/src/dialect/mysql.rs b/src/dialect/mysql.rs index 4bfa17a..c6607b0 100644 --- a/src/dialect/mysql.rs +++ b/src/dialect/mysql.rs
@@ -140,6 +140,11 @@ true } + /// See <https://dev.mysql.com/doc/refman/8.4/en/create-table-like.html> + fn supports_create_table_like_plain(&self) -> bool { + true + } + /// See: <https://dev.mysql.com/doc/refman/8.4/en/insert.html> fn supports_insert_set(&self) -> bool { true
diff --git a/src/dialect/snowflake.rs b/src/dialect/snowflake.rs index 3ebc168..29706f9 100644 --- a/src/dialect/snowflake.rs +++ b/src/dialect/snowflake.rs
@@ -225,6 +225,11 @@ true } + /// See <https://docs.snowflake.com/en/sql-reference/sql/create-table#label-create-table-like> + fn supports_create_table_like_plain(&self) -> bool { + true + } + /// See [doc](https://docs.snowflake.com/en/sql-reference/functions/extract) fn supports_extract_comma_syntax(&self) -> bool { true
diff --git a/src/dialect/spark.rs b/src/dialect/spark.rs index 024aec7..1b832d5 100644 --- a/src/dialect/spark.rs +++ b/src/dialect/spark.rs
@@ -128,6 +128,11 @@ true } + /// See <https://spark.apache.org/docs/latest/sql-ref-syntax-ddl-create-table-like.html> + fn supports_create_table_like_plain(&self) -> bool { + true + } + /// Parse the `DIV` keyword as integer division. /// /// Example: `SELECT 10 DIV 3` returns `3`.
diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 1a46c6e..3251944 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs
@@ -9084,7 +9084,9 @@ self.prev_token(); None } - } else if self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE) { + } else if self.dialect.supports_create_table_like_plain() + && (self.parse_keyword(Keyword::LIKE) || self.parse_keyword(Keyword::ILIKE)) + { let name = self.parse_object_name(allow_unquoted_hyphen)?; Some(CreateTableLikeKind::Plain(CreateTableLike { name,
diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 8e08c65..1ed3269 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs
@@ -18862,7 +18862,7 @@ #[test] fn parse_create_table_like() { - let dialects = all_dialects_except(|d| d.supports_create_table_like_parenthesized()); + let dialects = all_dialects_where(|d| d.supports_create_table_like_plain()); let sql = "CREATE TABLE new LIKE old"; match dialects.verified_stmt(sql) { Statement::CreateTable(stmt) => { @@ -18880,6 +18880,14 @@ } _ => unreachable!(), } + for keyword in ["LIKE", "ILIKE"] { + assert_eq!( + all_dialects_where(|d| !d.supports_create_table_like_plain()) + .parse_sql_statements(&format!("CREATE TABLE new {keyword} old")) + .unwrap_err(), + ParserError::ParserError(format!("Expected: end of statement, found: {keyword}")) + ); + } let dialects = all_dialects_where(|d| d.supports_create_table_like_parenthesized()); let sql = "CREATE TABLE new (LIKE old)"; match dialects.verified_stmt(sql) {