diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java index 4a5a29c86b..0c627ce86e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java @@ -56,6 +56,7 @@ import static org.jooq.impl.DSL.selectOne; import static org.jooq.impl.DSL.table; import static org.jooq.impl.Tools.aliasedFields; import static org.jooq.impl.Tools.fieldNames; +import static org.jooq.impl.Tools.DataKey.DATA_INSERT_SELECT_WITHOUT_INSERT_COLUMN_LIST; import java.util.Arrays; import java.util.Map; @@ -349,17 +350,25 @@ final class InsertQueryImpl extends AbstractStoreQuery impl .declareTables(declareTables); // [#1506] with DEFAULT VALUES, we might not have any columns to render - if (insertMaps.isExecutable()) { + if (insertMaps.isExecutable()) insertMaps.insertMaps.get(0).toSQLReferenceKeys(ctx); - } ctx.end(INSERT_INSERT_INTO); if (select != null) { + + // [#2995] Prevent the generation of wrapping parentheses around the + // INSERT .. SELECT statement's SELECT because they would be + // interpreted as the (missing) INSERT column list's parens. + if (insertMaps.insertMaps.get(0).size() == 0) + ctx.data(DATA_INSERT_SELECT_WITHOUT_INSERT_COLUMN_LIST, true); + ctx.formatSeparator() .start(INSERT_SELECT) .visit(select) .end(INSERT_SELECT); + + ctx.data().remove(DATA_INSERT_SELECT_WITHOUT_INSERT_COLUMN_LIST); } else if (defaultValues) { switch (ctx.family()) { diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 020c2abd65..62038ab299 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -99,6 +99,7 @@ import static org.jooq.impl.DSL.row; import static org.jooq.impl.Tools.fieldArray; import static org.jooq.impl.Tools.DataKey.DATA_COLLECTED_SEMI_ANTI_JOIN; import static org.jooq.impl.Tools.DataKey.DATA_COLLECT_SEMI_ANTI_JOIN; +import static org.jooq.impl.Tools.DataKey.DATA_INSERT_SELECT_WITHOUT_INSERT_COLUMN_LIST; import static org.jooq.impl.Tools.DataKey.DATA_LOCALLY_SCOPED_DATA_MAP; import static org.jooq.impl.Tools.DataKey.DATA_OMIT_INTO_CLAUSE; import static org.jooq.impl.Tools.DataKey.DATA_OVERRIDE_ALIASES_IN_ORDER_BY; @@ -926,6 +927,11 @@ final class SelectQueryImpl extends AbstractResultQuery imp + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index a24691981b..45fc30725d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -340,6 +340,14 @@ final class Tools { * [#1206] The collected Semi / Anti JOIN predicates. */ DATA_COLLECTED_SEMI_ANTI_JOIN, + + /** + * [#2995] An INSERT INTO t SELECT statement. Without any + * explicit column list, the SELECT statement must not be + * wrapped in parentheses (which would be interpreted as the column + * list's parentheses). + */ + DATA_INSERT_SELECT_WITHOUT_INSERT_COLUMN_LIST, } /**