diff --git a/jOOQ/src/main/java/org/jooq/CreateTypeStep.java b/jOOQ/src/main/java/org/jooq/CreateTypeStep.java index b7d35b3ab6..3230046518 100644 --- a/jOOQ/src/main/java/org/jooq/CreateTypeStep.java +++ b/jOOQ/src/main/java/org/jooq/CreateTypeStep.java @@ -97,4 +97,18 @@ public interface CreateTypeStep { @Support({ H2, POSTGRES, YUGABYTEDB }) @NotNull @CheckReturnValue CreateTypeFinalStep asEnum(); + + /** + * Add the AS clause to the CREATE TYPE statement. + */ + @Support({ POSTGRES, YUGABYTEDB }) + @NotNull @CheckReturnValue + CreateTypeFinalStep as(Field... attributes); + + /** + * Add the AS clause to the CREATE TYPE statement. + */ + @Support({ POSTGRES, YUGABYTEDB }) + @NotNull @CheckReturnValue + CreateTypeFinalStep as(Collection> attributes); } diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateTypeImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateTypeImpl.java index 38a415a335..f09338ce82 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateTypeImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateTypeImpl.java @@ -76,6 +76,7 @@ implements final Type type; QueryPartListView> values; + QueryPartListView> attributes; CreateTypeImpl( Configuration configuration, @@ -84,6 +85,7 @@ implements this( configuration, type, + null, null ); } @@ -91,12 +93,14 @@ implements CreateTypeImpl( Configuration configuration, Type type, - Collection> values + Collection> values, + Collection> attributes ) { super(configuration); this.type = type; this.values = new QueryPartList<>(values); + this.attributes = new QueryPartList<>(attributes); } // ------------------------------------------------------------------------- @@ -124,6 +128,17 @@ implements return this; } + @Override + public final CreateTypeImpl as(Field... attributes) { + return as(Arrays.asList(attributes)); + } + + @Override + public final CreateTypeImpl as(Collection> attributes) { + this.attributes = new QueryPartList<>(attributes); + return this; + } + // ------------------------------------------------------------------------- // XXX: QueryPart API // ------------------------------------------------------------------------- @@ -134,9 +149,32 @@ implements public final void accept(Context ctx) { ctx.visit(K_CREATE).sql(' ').visit(K_TYPE).sql(' ') .visit(type).sql(' ') - .visit(K_AS).sql(' ').visit(K_ENUM).sql(" (") - .visit(values, ParamType.INLINED) - .sql(')'); + .visit(K_AS).sql(' '); + + if (!values.isEmpty()) { + ctx.visit(K_ENUM).sql(" (") + .visit(values, ParamType.INLINED) + .sql(')'); + } + else { + + + + + + ctx.sql('(').visit( + new QueryPartList>(attributes).map(f -> declare(f)), + ParamType.INLINED + ).sql(')'); + } + } + + private static final Field declare(Field f) { + return CustomField.of(f.getUnqualifiedName(), f.getDataType(), c -> { + c.visit(f.getUnqualifiedName()); + c.sql(' '); + Tools.toSQLDDLTypeDeclarationForAddition(c, f.getDataType()); + }); } @@ -155,20 +193,32 @@ implements return QOM.unmodifiable(values); } + @Override + public final UnmodifiableList> $attributes() { + return QOM.unmodifiable(attributes); + } + @Override public final QOM.CreateType $type(Type newValue) { - return $constructor().apply(newValue, $values()); + return $constructor().apply(newValue, $values(), $attributes()); } @Override public final QOM.CreateType $values(Collection> newValue) { - return $constructor().apply($type(), newValue); + return $constructor().apply($type(), newValue, $attributes()); } - public final Function2, ? super Collection>, ? extends QOM.CreateType> $constructor() { - return (a1, a2) -> new CreateTypeImpl(configuration(), a1, (Collection>) a2); + @Override + public final QOM.CreateType $attributes(Collection> newValue) { + return $constructor().apply($type(), $values(), newValue); } + public final Function3, ? super Collection>, ? super Collection>, ? extends QOM.CreateType> $constructor() { + return (a1, a2, a3) -> new CreateTypeImpl(configuration(), a1, (Collection>) a2, (Collection>) a3); + } + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/DDLStatementType.java b/jOOQ/src/main/java/org/jooq/impl/DDLStatementType.java index 4d1f24aa6b..73f5d78aac 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DDLStatementType.java +++ b/jOOQ/src/main/java/org/jooq/impl/DDLStatementType.java @@ -51,6 +51,7 @@ enum DDLStatementType { ALTER_SEQUENCE, ALTER_TABLE, ALTER_TRIGGER, + ALTER_TYPE, ALTER_VIEW, CREATE_DATABASE, @@ -62,6 +63,7 @@ enum DDLStatementType { CREATE_SEQUENCE, CREATE_TABLE, CREATE_TRIGGER, + CREATE_TYPE, CREATE_VIEW, DROP_DATABASE, @@ -73,5 +75,6 @@ enum DDLStatementType { DROP_SEQUENCE, DROP_TABLE, DROP_TRIGGER, + DROP_TYPE, DROP_VIEW, } diff --git a/jOOQ/src/main/java/org/jooq/impl/DropTypeImpl.java b/jOOQ/src/main/java/org/jooq/impl/DropTypeImpl.java index 67237843ca..94665bef84 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DropTypeImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DropTypeImpl.java @@ -126,11 +126,39 @@ implements + private static final Set NO_SUPPORT_IF_EXISTS = SQLDialect.supportedUntil(); + @Override public final void accept(Context ctx) { + + + + + + + + + + + + accept0(ctx); + } + + private final boolean supportsIfExists(Context ctx) { + return !NO_SUPPORT_IF_EXISTS.contains(ctx.dialect()); + } + + private final void accept0(Context ctx) { + if (ifExists && !supportsIfExists(ctx)) + tryCatch(ctx, DDLStatementType.DROP_TYPE, c -> accept1(c)); + else + accept1(ctx); + } + + private final void accept1(Context ctx) { ctx.visit(K_DROP).sql(' ').visit(K_TYPE); - if (ifExists) + if (ifExists && supportsIfExists(ctx)) ctx.sql(' ').visit(K_IF_EXISTS); ctx.sql(' ').visit(types); diff --git a/jOOQ/src/main/java/org/jooq/impl/Keywords.java b/jOOQ/src/main/java/org/jooq/impl/Keywords.java index 7d3a897a2d..bd279d3e51 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Keywords.java +++ b/jOOQ/src/main/java/org/jooq/impl/Keywords.java @@ -288,6 +288,7 @@ final class Keywords { static final Keyword K_NULLS_LAST = keyword("nulls last"); static final Keyword K_NUMERIC = keyword("numeric"); static final Keyword K_NVARCHAR = keyword("nvarchar"); + static final Keyword K_OBJECT = keyword("object"); static final Keyword K_OCCURRENCE = keyword("occurrence"); static final Keyword K_OF = keyword("of"); static final Keyword K_OFFSET = keyword("offset"); diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 03cec9c17b..318513668d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -5115,18 +5115,28 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { private final DDLQuery parseCreateType() { Name name = parseName(); - parseKeyword("AS ENUM"); - List values; - parse('('); + parseKeyword("AS"); - if (!parseIf(')')) { - values = parseList(',', ParseContext::parseStringLiteral); - parse(')'); + if (parseKeywordIf("ENUM")) { + List values; + 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)); } private final Index parseIndexSpecification(Table table) { diff --git a/jOOQ/src/main/java/org/jooq/impl/QOM.java b/jOOQ/src/main/java/org/jooq/impl/QOM.java index eee63e3235..b6f09fcc8b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QOM.java +++ b/jOOQ/src/main/java/org/jooq/impl/QOM.java @@ -2269,10 +2269,13 @@ public final class QOM { { @NotNull Type $type(); @NotNull UnmodifiableList> $values(); + @NotNull UnmodifiableList> $attributes(); @CheckReturnValue @NotNull CreateType $type(Type type); @CheckReturnValue @NotNull CreateType $values(Collection> values); + @CheckReturnValue + @NotNull CreateType $attributes(Collection> attributes); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index fae50b5c32..64a6cc3d9f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -5510,6 +5510,8 @@ final class Tools { + +