diff --git a/src/parser.rs b/src/parser.rs index d2ab7b1ae..4993eb29a 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1006,7 +1006,12 @@ impl Parser { let table_name = self.parse_object_name()?; let (columns, constraints) = self.parse_columns()?; self.expect_keywords(&[Keyword::STORED, Keyword::AS])?; - let file_format = self.parse_identifier()?.value.parse::()?; + // We probably shouldn't parse the file format as an identifier.. + let file_format = self + .parse_identifier()? + .value + .to_ascii_uppercase() + .parse::()?; self.expect_keyword(Keyword::LOCATION)?; let location = self.parse_literal_string()?; diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 3b55f8b8f..5599eab91 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -1289,6 +1289,24 @@ fn parse_create_external_table() { } } +#[test] +fn parse_create_external_table_lowercase() { + let sql = "create external table uk_cities (\ + name varchar(100) not null,\ + lat double null,\ + lng double)\ + stored as parquet location '/tmp/example.csv'"; + let ast = one_statement_parses_to( + sql, + "CREATE EXTERNAL TABLE uk_cities (\ + name character varying(100) NOT NULL, \ + lat double NULL, \ + lng double) \ + STORED AS PARQUET LOCATION '/tmp/example.csv'", + ); + assert_matches!(ast, Statement::CreateTable{..}); +} + #[test] fn parse_create_table_empty() { // Zero-column tables are weird, but supported by at least PostgreSQL.