From 0129d593183d2037e1776f9e81f110a1797b9fc2 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Thu, 31 Jan 2019 15:42:39 +0100 Subject: [PATCH] [#5309] Emulate CTAS with column lists where not supported --- .../java/org/jooq/impl/CreateTableImpl.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java index c3d571ae29..a74d37a9f0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java @@ -67,12 +67,15 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +import static org.jooq.impl.DSL.asterisk; import static org.jooq.impl.DSL.commentOnTable; import static org.jooq.impl.DSL.createIndex; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.insertInto; import static org.jooq.impl.DSL.name; +import static org.jooq.impl.DSL.select; import static org.jooq.impl.DSL.sql; +import static org.jooq.impl.DSL.table; import static org.jooq.impl.Keywords.K_AS; import static org.jooq.impl.Keywords.K_COMMENT; import static org.jooq.impl.Keywords.K_CREATE; @@ -87,6 +90,7 @@ import static org.jooq.impl.Keywords.K_TEMPORARY; import static org.jooq.impl.Keywords.K_UNIQUE; import static org.jooq.impl.Keywords.K_WITH_DATA; import static org.jooq.impl.Keywords.K_WITH_NO_DATA; +import static org.jooq.impl.Tools.EMPTY_FIELD; import static org.jooq.impl.Tools.begin; import static org.jooq.impl.Tools.beginExecuteImmediate; import static org.jooq.impl.Tools.end; @@ -134,6 +138,7 @@ final class CreateTableImpl extends AbstractQuery implements private static final long serialVersionUID = 8904572826501186329L; private static final EnumSet NO_SUPPORT_IF_NOT_EXISTS = EnumSet.of(DERBY, FIREBIRD); private static final EnumSet NO_SUPPORT_WITH_DATA = EnumSet.of(H2, MARIADB, MYSQL, SQLITE); + private static final EnumSet NO_SUPPORT_CTAS_COLUMN_NAMES = EnumSet.of(H2); private static final EnumSet EMULATE_INDEXES_IN_BLOCK = EnumSet.of(POSTGRES); private static final EnumSet EMULATE_ENUM_TYPES_AS_CHECK = EnumSet.of(CUBRID, DERBY, FIREBIRD, HSQLDB, SQLITE); private static final EnumSet REQUIRES_WITH_DATA = EnumSet.of(HSQLDB); @@ -147,8 +152,6 @@ final class CreateTableImpl extends AbstractQuery implements - - private final Table table; private Select select; private Boolean withData; @@ -439,7 +442,8 @@ final class CreateTableImpl extends AbstractQuery implements private void toSQLCreateTable(Context ctx) { toSQLCreateTableName(ctx); - if (!columnFields.isEmpty()) { + if (!columnFields.isEmpty() + && (select == null || !NO_SUPPORT_CTAS_COLUMN_NAMES.contains(ctx.family()))) { ctx.sql('(') .start(CREATE_TABLE_COLUMNS) .formatIndentStart() @@ -547,9 +551,14 @@ final class CreateTableImpl extends AbstractQuery implements if (FALSE.equals(withData) && NO_SUPPORT_WITH_DATA.contains(ctx.family())) ctx.data(DATA_SELECT_NO_DATA, true); - ctx.start(CREATE_TABLE_AS) - .visit(select) - .end(CREATE_TABLE_AS); + ctx.start(CREATE_TABLE_AS); + + if (NO_SUPPORT_CTAS_COLUMN_NAMES.contains(ctx.family())) + ctx.visit(select(asterisk()).from(table(select).as(table(name("t")), columnFields.toArray(EMPTY_FIELD)))); + else + ctx.visit(select); + + ctx.end(CREATE_TABLE_AS); if (FALSE.equals(withData) && NO_SUPPORT_WITH_DATA.contains(ctx.family())) ctx.data().remove(DATA_SELECT_NO_DATA);