Skip to content

Commit d5c2ede

Browse files
committed
Fix: Generic supports CREATE TYPE AS ENUM
1 parent f5993b3 commit d5c2ede

File tree

5 files changed

+37
-44
lines changed

5 files changed

+37
-44
lines changed

src/dialect/generic.rs

+4
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,10 @@ impl Dialect for GenericDialect {
156156
true
157157
}
158158

159+
fn supports_create_type_as_enum(&self) -> bool {
160+
true
161+
}
162+
159163
fn supports_alter_type(&self) -> bool {
160164
true
161165
}

src/dialect/mod.rs

+10
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,16 @@ pub trait Dialect: Debug + Any {
490490
false
491491
}
492492

493+
/// Return true if the dialect supports creating enum types
494+
///
495+
/// Example:
496+
/// ```sql
497+
/// CREATE TYPE some_enum AS ENUM('one', 'two', 'three');
498+
/// ```
499+
fn supports_create_type_as_enum(&self) -> bool {
500+
false
501+
}
502+
493503
/// Return true if the dialect supports ALTER TYPE statements
494504
///
495505
/// Example:

src/dialect/postgresql.rs

+3-43
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
// limitations under the License.
2929
use log::debug;
3030

31-
use crate::ast::{ObjectName, Statement, UserDefinedTypeRepresentation};
3231
use crate::dialect::{Dialect, Precedence};
3332
use crate::keywords::Keyword;
3433
use crate::parser::{Parser, ParserError};
@@ -135,15 +134,6 @@ impl Dialect for PostgreSqlDialect {
135134
}
136135
}
137136

138-
fn parse_statement(&self, parser: &mut Parser) -> Option<Result<Statement, ParserError>> {
139-
if parser.parse_keyword(Keyword::CREATE) {
140-
parser.prev_token(); // unconsume the CREATE in case we don't end up parsing anything
141-
parse_create(parser)
142-
} else {
143-
None
144-
}
145-
}
146-
147137
fn supports_filter_during_aggregation(&self) -> bool {
148138
true
149139
}
@@ -259,41 +249,11 @@ impl Dialect for PostgreSqlDialect {
259249
true
260250
}
261251

262-
fn supports_alter_type(&self) -> bool {
252+
fn supports_create_type_as_enum(&self) -> bool {
263253
true
264254
}
265-
}
266-
267-
pub fn parse_create(parser: &mut Parser) -> Option<Result<Statement, ParserError>> {
268-
let name = parser.maybe_parse(|parser| -> Result<ObjectName, ParserError> {
269-
parser.expect_keyword_is(Keyword::CREATE)?;
270-
parser.expect_keyword_is(Keyword::TYPE)?;
271-
let name = parser.parse_object_name(false)?;
272-
parser.expect_keyword_is(Keyword::AS)?;
273-
parser.expect_keyword_is(Keyword::ENUM)?;
274-
Ok(name)
275-
});
276-
277-
match name {
278-
Ok(name) => name.map(|name| parse_create_type_as_enum(parser, name)),
279-
Err(e) => Some(Err(e)),
280-
}
281-
}
282255

283-
// https://www.postgresql.org/docs/current/sql-createtype.html
284-
pub fn parse_create_type_as_enum(
285-
parser: &mut Parser,
286-
name: ObjectName,
287-
) -> Result<Statement, ParserError> {
288-
if !parser.consume_token(&Token::LParen) {
289-
return parser.expected("'(' after CREATE TYPE AS ENUM", parser.peek_token());
256+
fn supports_alter_type(&self) -> bool {
257+
true
290258
}
291-
292-
let labels = parser.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
293-
parser.expect_token(&Token::RParen)?;
294-
295-
Ok(Statement::CreateType {
296-
name,
297-
representation: UserDefinedTypeRepresentation::Enum { labels },
298-
})
299259
}

src/parser/mod.rs

+19
Original file line numberDiff line numberDiff line change
@@ -14276,6 +14276,10 @@ impl<'a> Parser<'a> {
1427614276
let name = self.parse_object_name(false)?;
1427714277
self.expect_keyword_is(Keyword::AS)?;
1427814278

14279+
if self.dialect.supports_create_type_as_enum() && self.parse_keyword(Keyword::ENUM) {
14280+
return self.parse_create_type_enum(name);
14281+
}
14282+
1427914283
let mut attributes = vec![];
1428014284
if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
1428114285
return Ok(Statement::CreateType {
@@ -14312,6 +14316,21 @@ impl<'a> Parser<'a> {
1431214316
})
1431314317
}
1431414318

14319+
// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
14320+
pub fn parse_create_type_enum(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
14321+
if !self.consume_token(&Token::LParen) {
14322+
return self.expected("'(' after CREATE TYPE AS ENUM", self.peek_token());
14323+
}
14324+
14325+
let labels = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
14326+
self.expect_token(&Token::RParen)?;
14327+
14328+
Ok(Statement::CreateType {
14329+
name,
14330+
representation: UserDefinedTypeRepresentation::Enum { labels },
14331+
})
14332+
}
14333+
1431514334
fn parse_parenthesized_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
1431614335
self.expect_token(&Token::LParen)?;
1431714336
let partitions = self.parse_comma_separated(|p| p.parse_identifier())?;

tests/sqlparser_postgres.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5293,7 +5293,7 @@ fn arrow_cast_precedence() {
52935293

52945294
#[test]
52955295
fn parse_create_type_as_enum() {
5296-
let statement = pg().one_statement_parses_to(
5296+
let statement = pg_and_generic().one_statement_parses_to(
52975297
r#"CREATE TYPE public.my_type AS ENUM (
52985298
'label1',
52995299
'label2',

0 commit comments

Comments
 (0)