From 4168c15d2b84bb35bc7e58d7edb5883f09c07566 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 25 Sep 2023 11:48:26 +0200 Subject: [PATCH] [jOOQ/jOOQ#15632] Support InlineDerivedTables in DELETE and INSERT This includes: - [jOOQ/jOOQ#15634] Distinguish between Context::qualify and Context::qualifySchema --- jOOQ/src/main/java/org/jooq/Context.java | 17 ++------- .../java/org/jooq/impl/AbstractContext.java | 10 +++--- .../java/org/jooq/impl/AbstractRoutine.java | 2 +- .../java/org/jooq/impl/AlterSequenceImpl.java | 4 +-- .../java/org/jooq/impl/AlterTableImpl.java | 2 -- .../java/org/jooq/impl/ConstraintImpl.java | 2 -- .../org/jooq/impl/DefaultRenderContext.java | 1 + .../java/org/jooq/impl/DeleteQueryImpl.java | 16 ++++----- .../java/org/jooq/impl/InsertQueryImpl.java | 36 +++++++++---------- .../main/java/org/jooq/impl/TableImpl.java | 2 +- .../java/org/jooq/impl/UpdateQueryImpl.java | 3 +- 11 files changed, 40 insertions(+), 55 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/Context.java b/jOOQ/src/main/java/org/jooq/Context.java index df3c2833d6..a004bd0d83 100644 --- a/jOOQ/src/main/java/org/jooq/Context.java +++ b/jOOQ/src/main/java/org/jooq/Context.java @@ -800,8 +800,6 @@ public interface Context> extends ExecuteScope { /** * Set the new context value for {@link #qualify()}. - *

- * This is the same as {@link #qualifySchema(boolean)}. */ @NotNull C qualify(boolean qualify); @@ -814,9 +812,7 @@ public interface Context> extends ExecuteScope { C qualify(boolean qualify, Consumer consumer); /** - * Whether query parts should render qualified names or not. - *

- * This is the same as {@link #qualifySchema()}. + * Whether query parts should render {@link Schema}-qualified names or not. */ boolean qualifySchema(); @@ -834,18 +830,12 @@ public interface Context> extends ExecuteScope { C qualifySchema(boolean qualifySchema, Consumer consumer); /** - * Whether query parts should render qualified names or not. - *

- * The catalog can only be qualified when {@link #qualifySchema()} is - * true as well. + * Whether query parts should render {@link Catalog}-qualified names or not. */ boolean qualifyCatalog(); /** * Set the new context value for {@link #qualifyCatalog()}. - *

- * The catalog can only be qualified when {@link #qualifySchema()} is - * true as well. */ @NotNull C qualifyCatalog(boolean qualifyCatalog); @@ -853,9 +843,6 @@ public interface Context> extends ExecuteScope { /** * Set the new context value for {@link #qualifyCatalog()} for the scope of * a {@link Consumer}. - *

- * The catalog can only be qualified when {@link #qualifySchema()} is - * true as well. */ @NotNull C qualifyCatalog(boolean qualifyCatalog, Consumer consumer); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java index 9dfe09b051..af58e4aa11 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java @@ -161,6 +161,7 @@ abstract class AbstractContext> extends AbstractScope imple LanguageContext languageContext; ParamType paramType = ParamType.INDEXED; boolean quote = true; + boolean qualify = true; boolean qualifySchema = true; boolean qualifyCatalog = true; QueryPart topLevel; @@ -1027,12 +1028,13 @@ abstract class AbstractContext> extends AbstractScope imple @Override public final boolean qualify() { - return qualifySchema(); + return qualify; } @Override public final C qualify(boolean q) { - return qualifySchema(q); + this.qualify = q; + return (C) this; } @Override @@ -1042,7 +1044,7 @@ abstract class AbstractContext> extends AbstractScope imple @Override public final boolean qualifySchema() { - return qualifySchema; + return qualify && qualifySchema; } @Override @@ -1058,7 +1060,7 @@ abstract class AbstractContext> extends AbstractScope imple @Override public final boolean qualifyCatalog() { - return qualifyCatalog; + return qualify && qualifyCatalog; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java index fbbd955273..e279b31ae6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java @@ -1618,7 +1618,7 @@ implements private final Name getQualifiedName(Context ctx) { List list = new ArrayList<>(); - if (ctx.qualify()) { + if (ctx.qualifySchema()) { Schema mapped = Tools.getMappedSchema(ctx, getSchema()); if (mapped != null && !"".equals(mapped.getName())) diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java index e25b0edeb4..81130d71d5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java @@ -331,8 +331,6 @@ implements } private final void acceptRenameTable(Context ctx) { - boolean qualify = ctx.qualify(); - ctx.start(Clause.ALTER_SEQUENCE_SEQUENCE) .start(Clause.ALTER_SEQUENCE_RENAME) .visit(K_ALTER_TABLE) @@ -341,7 +339,7 @@ implements .sql(' ') .visit(K_RENAME_TO) .sql(' ') - .qualify(false, c -> c.visit(renameTo)) + .qualifySchema(false, c -> c.visit(renameTo)) .end(Clause.ALTER_SEQUENCE_RENAME) .end(Clause.ALTER_SEQUENCE_SEQUENCE); } diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java index a2d18007a3..afa46c07ca 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java @@ -1823,8 +1823,6 @@ implements - - diff --git a/jOOQ/src/main/java/org/jooq/impl/ConstraintImpl.java b/jOOQ/src/main/java/org/jooq/impl/ConstraintImpl.java index 8c95af60fc..7ff2c0708e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ConstraintImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ConstraintImpl.java @@ -208,8 +208,6 @@ implements ctx.visit(getQualifiedName()); } else { - boolean qualify = ctx.qualify(); - if (named ) ctx.visit(K_CONSTRAINT).sql(' ') .visit(getUnqualifiedName()).sql(' '); diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java index 2cbf23bae6..6a14c3efe1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java @@ -148,6 +148,7 @@ class DefaultRenderContext extends AbstractContext implements Ren this(context.configuration(), context.executeContext()); paramType(context.paramType()); + qualify(context.qualify()); qualifyCatalog(context.qualifyCatalog()); qualifySchema(context.qualifySchema()); quote(context.quote()); diff --git a/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java index a4b862fe14..98436ad224 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java @@ -252,14 +252,14 @@ implements @Override public final void accept(Context ctx) { - - - - - - - - accept0(ctx); + // [#2682] [#15632] Apply inline derived tables to the target table (TODO: Apply also to USING, etc.) + // [#15632] TODO: Check if this behaves correctly with aliases + Table t = InlineDerivedTable.inlineDerivedTable(ctx, table(ctx)); + if (t instanceof InlineDerivedTable i) { + copy(d -> d.addConditions(i.condition), i.table).accept0(ctx); + } + else + accept0(ctx); } @SuppressWarnings({ "unchecked", "rawtypes" }) diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java index f567e5b9a3..b34dff4143 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java @@ -376,24 +376,24 @@ implements @Override public final void accept(Context ctx) { - - - - - - - - - - - - - - - - - - accept0(ctx); + // [#2682] [#15632] Apply inline derived tables to the target table (TODO: Apply also to FROM, etc.) + // [#15632] TODO: Check if this behaves correctly with aliases + Table t = InlineDerivedTable.inlineDerivedTable(ctx, table(ctx)); + if (t instanceof InlineDerivedTable i) { + copy( + d -> { + if (!d.insertMaps.values.isEmpty()) + d.select = + selectFrom( + d.insertMaps.insertSelect(ctx, null) + .asTable(i.table, d.insertMaps.keysFlattened(ctx, GeneratorStatementType.INSERT))) + .where(CustomCondition.of(c1 -> c1.qualifySchema(false, c2 -> c2.visit(i.condition)))); + }, + i.table + ).accept0(ctx); + } + else + accept0(ctx); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java index 337ad38ef9..0b9b00d659 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java @@ -469,7 +469,7 @@ implements if (ctx.declareTables()) ctx.scopeMarkStart(this); - if (ctx.qualify() && (ctx.declareTables() + if (ctx.qualifySchema() && (ctx.declareTables() || (!NO_SUPPORT_QUALIFIED_TVF_CALLS.contains(ctx.dialect()) || parameters == null) diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java index 6bacffb171..cd456cd97f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java @@ -564,7 +564,8 @@ implements @Override public final void accept(Context ctx) { - // [#2682] [#15632] Apply inline derived tables to the target table (TODO: Apply also to USING, etc.) + // [#2682] [#15632] Apply inline derived tables to the target table (TODO: Apply also to FROM, etc.) + // [#15632] TODO: Check if this behaves correctly with aliases Table t = InlineDerivedTable.inlineDerivedTable(ctx, table(ctx)); if (t instanceof InlineDerivedTable i) { copy(d -> d.addConditions(i.condition), i.table).accept0(ctx);