From e5c7e81553ae2b449ee67c6d509d9b4e3bc8227a Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 30 Aug 2023 10:18:25 +0200 Subject: [PATCH] [jOOQ/jOOQ#11584] Add parser support for SQL Server CREATE TYPE and DROP TYPE --- .../main/java/org/jooq/impl/ParserImpl.java | 55 +++++++++++++------ 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 318513668d..06189e3711 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -3146,7 +3146,19 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { ; - else if (parseKeywordIf("TYPE")) + else if (parseKeywordIf("TYPE")) { + + + + + + + + + + + + return parseCascadeRestrictIf( parseIfExists(this::parseIdentifiers, n -> dsl.dropTypeIfExists(n.toArray(EMPTY_NAME)), @@ -3155,6 +3167,7 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { DropTypeStep::cascade, DropTypeStep::restrict ); + } else if (parseKeywordIf("TABLESPACE")) throw notImplemented("DROP TABLESPACE"); @@ -5115,28 +5128,34 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { private final DDLQuery parseCreateType() { Name name = parseName(); - parseKeyword("AS"); - if (parseKeywordIf("ENUM")) { - List values; - parse('('); + if (parseKeywordIf("AS")) { + if (parseKeywordIf("ENUM")) { + List values; + parse('('); - if (!parseIf(')')) { - values = parseList(',', ParseContext::parseStringLiteral); - parse(')'); + if (!parseIf(')')) { + values = parseList(',', ParseContext::parseStringLiteral); + parse(')'); + } + else + values = new ArrayList<>(); + + return dsl.createType(name).asEnum(values.toArray(EMPTY_STRING)); + } + else { + parseKeywordIf("OBJECT"); + parse('('); + List> fields = parseList(',', ctx -> DSL.field(parseIdentifier(), parseDataType())); + parse(')'); + return dsl.createType(name).as(fields); } - else - values = new ArrayList<>(); - - return dsl.createType(name).asEnum(values.toArray(EMPTY_STRING)); } - else { - parseKeywordIf("OBJECT"); - parse('('); - List> fields = parseList(',', ctx -> DSL.field(parseIdentifier(), parseDataType())); - parse(')'); - return dsl.createType(name).as(fields); + else if (parseKeywordIf("FROM")) { + return dsl.createDomain(name).as(parseDataType()); } + else + throw expected("AS", "FROM"); } private final Index parseIndexSpecification(Table table) {