diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java index 127d4d1639..f34e73ff76 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java @@ -2298,6 +2298,8 @@ public class JavaGenerator extends AbstractGenerator { + + @@ -6096,7 +6098,6 @@ public class JavaGenerator extends AbstractGenerator { return result; } - @SuppressWarnings("unchecked") private static final List list(T first, List remaining) { List result = new ArrayList(); diff --git a/jOOQ/src/main/java/org/jooq/ArrayRecord.java b/jOOQ/src/main/java/org/jooq/ArrayRecord.java index 84e7ffbee7..cf8bedf554 100644 --- a/jOOQ/src/main/java/org/jooq/ArrayRecord.java +++ b/jOOQ/src/main/java/org/jooq/ArrayRecord.java @@ -116,6 +116,17 @@ package org.jooq; + + + + + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/CreateTableAsStep.java b/jOOQ/src/main/java/org/jooq/CreateTableAsStep.java index 8d5883b391..9b49aa44af 100644 --- a/jOOQ/src/main/java/org/jooq/CreateTableAsStep.java +++ b/jOOQ/src/main/java/org/jooq/CreateTableAsStep.java @@ -67,7 +67,7 @@ public interface CreateTableAsStep { * Add an AS clause to the CREATE TABLE statement. */ @Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) - CreateTableOnCommitStep as(Select select); + CreateTableWithDataStep as(Select select); /** * Add a column to the column list of the CREATE TABLE diff --git a/jOOQ/src/main/java/org/jooq/CreateTableWithDataStep.java b/jOOQ/src/main/java/org/jooq/CreateTableWithDataStep.java new file mode 100644 index 0000000000..f728b25d56 --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/CreateTableWithDataStep.java @@ -0,0 +1,75 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Other licenses: + * ----------------------------------------------------------------------------- + * Commercial licenses for this work are available. These replace the above + * ASL 2.0 and offer limited warranties, support, maintenance, and commercial + * database integrations. + * + * For more information, please visit: http://www.jooq.org/licenses + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ +package org.jooq; + +// ... +// ... +import static org.jooq.SQLDialect.CUBRID; +// ... +import static org.jooq.SQLDialect.DERBY; +import static org.jooq.SQLDialect.H2; +// ... +import static org.jooq.SQLDialect.HSQLDB; +// ... +import static org.jooq.SQLDialect.MARIADB; +import static org.jooq.SQLDialect.MYSQL; +// ... +import static org.jooq.SQLDialect.POSTGRES; +// ... +import static org.jooq.SQLDialect.SQLITE; +// ... + +/** + * A {@link Query} that can create tables. + * + * @author Lukas Eder + */ +public interface CreateTableWithDataStep extends CreateTableOnCommitStep { + + /** + * Add a WITH DATA clause. + */ + @Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + CreateTableCommentStep withData(); + + /** + * Add a WITH DATA clause. + */ + @Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) + CreateTableCommentStep withNoData(); +} diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayConstant.java b/jOOQ/src/main/java/org/jooq/impl/ArrayConstant.java index 5870c8f83e..569845dab7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayConstant.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayConstant.java @@ -145,6 +145,8 @@ package org.jooq.impl; + + diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java index 420baff666..4ea6864e5f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java @@ -386,6 +386,34 @@ package org.jooq.impl; + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java index c6388f47c8..32a379c3ab 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java @@ -37,6 +37,8 @@ */ package org.jooq.impl; +import static java.lang.Boolean.FALSE; +import static java.lang.Boolean.TRUE; import static org.jooq.Clause.CREATE_TABLE; import static org.jooq.Clause.CREATE_TABLE_AS; import static org.jooq.Clause.CREATE_TABLE_COLUMNS; @@ -47,6 +49,7 @@ import static org.jooq.Clause.CREATE_TABLE_NAME; // ... import static org.jooq.SQLDialect.DERBY; import static org.jooq.SQLDialect.FIREBIRD; +import static org.jooq.SQLDialect.H2; // ... import static org.jooq.SQLDialect.HSQLDB; import static org.jooq.SQLDialect.MARIADB; @@ -77,6 +80,7 @@ import static org.jooq.impl.Tools.beginExecuteImmediate; import static org.jooq.impl.Tools.end; import static org.jooq.impl.Tools.endExecuteImmediate; import static org.jooq.impl.Tools.DataKey.DATA_SELECT_INTO_TABLE; +import static org.jooq.impl.Tools.DataKey.DATA_SELECT_NO_DATA; import java.util.ArrayList; import java.util.Arrays; @@ -91,6 +95,7 @@ import org.jooq.Constraint; import org.jooq.Context; import org.jooq.CreateTableAsStep; import org.jooq.CreateTableColumnStep; +import org.jooq.CreateTableWithDataStep; import org.jooq.DataType; import org.jooq.Field; import org.jooq.Name; @@ -108,6 +113,7 @@ final class CreateTableImpl extends AbstractQuery implements // Cascading interface implementations for CREATE TABLE behaviour CreateTableAsStep, + CreateTableWithDataStep, CreateTableColumnStep { /** @@ -115,6 +121,8 @@ 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); + private static final EnumSet REQUIRES_WITH_DATA = EnumSet.of(HSQLDB); private static final EnumSet WRAP_SELECT_IN_PARENS = EnumSet.of(HSQLDB); private static final EnumSet SUPPORT_TEMPORARY = EnumSet.of(MARIADB, MYSQL, POSTGRES); @@ -123,6 +131,7 @@ final class CreateTableImpl extends AbstractQuery implements private final Table table; private Select select; + private Boolean withData; private final List> columnFields; private final List> columnTypes; private final List constraints; @@ -153,6 +162,18 @@ final class CreateTableImpl extends AbstractQuery implements return this; } + @Override + public final CreateTableImpl withData() { + withData = true; + return this; + } + + @Override + public final CreateTableImpl withNoData() { + withData = false; + return this; + } + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public final CreateTableImpl column(Field field) { @@ -369,19 +390,31 @@ final class CreateTableImpl extends AbstractQuery implements else ctx.formatSeparator(); + 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); + if (FALSE.equals(withData) && NO_SUPPORT_WITH_DATA.contains(ctx.family())) + ctx.data().remove(DATA_SELECT_NO_DATA); + if (WRAP_SELECT_IN_PARENS.contains(ctx.family())) { ctx.formatIndentEnd() .formatNewLine() .sql(')'); - - if (ctx.family() == HSQLDB) - ctx.sql(' ') - .visit(K_WITH_DATA); } + + if (FALSE.equals(withData) && !NO_SUPPORT_WITH_DATA.contains(ctx.family())) + ctx.sql(' ') + .visit(K_WITH_NO_DATA); + else if (TRUE.equals(withData) && !NO_SUPPORT_WITH_DATA.contains(ctx.family())) + ctx.sql(' ') + .visit(K_WITH_DATA); + else if (REQUIRES_WITH_DATA.contains(ctx.family())) + ctx.sql(' ') + .visit(K_WITH_DATA); } @@ -416,6 +449,10 @@ final class CreateTableImpl extends AbstractQuery implements + + + + @@ -454,9 +491,15 @@ final class CreateTableImpl extends AbstractQuery implements } private final void acceptSelectInto(Context ctx) { + if (FALSE.equals(withData)) + ctx.data(DATA_SELECT_NO_DATA, true); + ctx.data(DATA_SELECT_INTO_TABLE, table); ctx.visit(select); ctx.data().remove(DATA_SELECT_INTO_TABLE); + + if (FALSE.equals(withData)) + ctx.data().remove(DATA_SELECT_NO_DATA); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 3dbfdd4159..7f57e3fc0f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -278,6 +278,7 @@ import org.jooq.CreateTableColumnStep; import org.jooq.CreateTableCommentStep; import org.jooq.CreateTableConstraintStep; import org.jooq.CreateTableStorageStep; +import org.jooq.CreateTableWithDataStep; import org.jooq.DDLQuery; import org.jooq.DSLContext; import org.jooq.DataType; @@ -1813,7 +1814,14 @@ final class ParserImpl implements Parser { ? ctx.dsl.createTemporaryTable(tableName) : ctx.dsl.createTable(tableName); - storageStep = commentStep = s1.as(select); + CreateTableWithDataStep s2 = s1.as(select); + + storageStep = commentStep = + parseKeywordIf(ctx, "WITH DATA") + ? s2.withData() + : parseKeywordIf(ctx, "WITH NO DATA") + ? s2.withNoData() + : s2; } else { List> fields = new ArrayList>(); @@ -7260,6 +7268,7 @@ final class ParserImpl implements Parser { "UNION", "USING", "WHERE", + "WITH", }; private static final String[] PIVOT_KEYWORDS = { diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index f9ca8f21e9..875dc2959c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -88,6 +88,7 @@ import static org.jooq.impl.CombineOperator.INTERSECT; import static org.jooq.impl.CombineOperator.INTERSECT_ALL; import static org.jooq.impl.CombineOperator.UNION; import static org.jooq.impl.CombineOperator.UNION_ALL; +import static org.jooq.impl.DSL.falseCondition; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.one; @@ -1226,7 +1227,12 @@ final class SelectQueryImpl extends AbstractResultQuery imp // ------------ context.start(SELECT_WHERE); - if (!getWhere().hasWhere() && semiAntiJoinPredicates == null) + if (TRUE.equals(context.data().get(DataKey.DATA_SELECT_NO_DATA))) + context.formatSeparator() + .visit(K_WHERE) + .sql(' ') + .visit(falseCondition()); + else if (!getWhere().hasWhere() && semiAntiJoinPredicates == null) ; else { ConditionProviderImpl where = new ConditionProviderImpl(); diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 991e052f58..c940d5e6bb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -405,6 +405,11 @@ final class Tools { */ DATA_SELECT_INTO_TABLE, + /** + * [#7139] No data must be selected in the SELECT statement. + */ + DATA_SELECT_NO_DATA, + /** * [#3381] Omit the {@link Clause#SELECT_INTO}, as it is being emulated. */ @@ -2445,6 +2450,11 @@ final class Tools { + + + + +