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 extends Field>> 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 extends Field> values;
+ QueryPartListView extends Field>> 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 extends Field> values
+ Collection extends Field> values,
+ Collection extends Field>> 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 extends Field>> 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 extends Field>> $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 extends Field> newValue) {
- return $constructor().apply($type(), newValue);
+ return $constructor().apply($type(), newValue, $attributes());
}
- public final Function2 super Type>, ? super Collection extends Field>, ? extends QOM.CreateType> $constructor() {
- return (a1, a2) -> new CreateTypeImpl(configuration(), a1, (Collection extends Field>) a2);
+ @Override
+ public final QOM.CreateType $attributes(Collection extends Field>> newValue) {
+ return $constructor().apply($type(), $values(), newValue);
}
+ public final Function3 super Type>, ? super Collection extends Field>, ? super Collection extends Field>>, ? extends QOM.CreateType> $constructor() {
+ return (a1, a2, a3) -> new CreateTypeImpl(configuration(), a1, (Collection extends Field>) a2, (Collection extends Field>>) 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 extends Field> $values();
+ @NotNull UnmodifiableList extends Field>> $attributes();
@CheckReturnValue
@NotNull CreateType $type(Type> type);
@CheckReturnValue
@NotNull CreateType $values(Collection extends Field> values);
+ @CheckReturnValue
+ @NotNull CreateType $attributes(Collection extends Field>> 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 {
+
+