diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java index 3e95bd4f9a..00a94748d2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java @@ -162,6 +162,7 @@ import org.jooq.conf.RenderMapping; import org.jooq.conf.RenderNameCase; import org.jooq.conf.SettingsTools; import org.jooq.exception.DataAccessException; +import org.jooq.impl.DataChangeDeltaTable.ResultOption; import org.jooq.impl.DefaultUnwrapperProvider.DefaultUnwrapper; import org.jooq.impl.Tools.BooleanDataKey; import org.jooq.impl.Tools.DataKey; diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 2df926e062..f3276c8791 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -10900,7 +10900,29 @@ public class DSL { */ @NotNull @Support({ H2, POSTGRES }) - public static Table oldTable(DMLQuery query) { + public static Table oldTable(Update query) { + return new DataChangeDeltaTable<>(ResultOption.OLD, query); + } + + /** + * Get the data change delta table with result option OLD to + * retrieve the modified data from before the {@link Update} or + * {@link Delete} statement was applied. + */ + @NotNull + @Support({ H2, POSTGRES }) + public static Table oldTable(Delete query) { + return new DataChangeDeltaTable<>(ResultOption.OLD, query); + } + + /** + * Get the data change delta table with result option OLD to + * retrieve the modified data from before the {@link Update} or + * {@link Delete} statement was applied. + */ + @NotNull + @Support({ H2, POSTGRES }) + public static Table oldTable(Merge query) { return new DataChangeDeltaTable<>(ResultOption.OLD, query); } @@ -10913,10 +10935,35 @@ public class DSL { */ @NotNull @Support({ H2, POSTGRES }) - public static Table newTable(DMLQuery query) { + public static Table newTable(Insert query) { return new DataChangeDeltaTable(ResultOption.NEW, query); } + /** + * Get the data change delta table with result option NEW to + * retrieve the modified data from after the {@link Update} or + * {@link Insert} statement was applied. + *

+ * This does not include trigger generated values. + */ + @NotNull + @Support({ H2, POSTGRES }) + public static Table newTable(Update query) { + return new DataChangeDeltaTable(ResultOption.NEW, query); + } + + /** + * Get the data change delta table with result option NEW to + * retrieve the modified data from after the {@link Update} or + * {@link Insert} statement was applied. + *

+ * This does not include trigger generated values. + */ + @NotNull + @Support({ H2, POSTGRES }) + public static Table newTable(Merge query) { + return new DataChangeDeltaTable(ResultOption.NEW, query); + } /** * Get the data change delta table with result option NEW to @@ -10927,7 +10974,33 @@ public class DSL { */ @NotNull @Support({ H2, POSTGRES }) - public static Table finalTable(DMLQuery query) { + public static Table finalTable(Insert query) { + return new DataChangeDeltaTable<>(ResultOption.FINAL, query); + } + + /** + * Get the data change delta table with result option NEW to + * retrieve the modified data from after the {@link Update} or + * {@link Insert} statement was applied. + *

+ * This includes trigger generated values. + */ + @NotNull + @Support({ H2, POSTGRES }) + public static Table finalTable(Update query) { + return new DataChangeDeltaTable<>(ResultOption.FINAL, query); + } + + /** + * Get the data change delta table with result option NEW to + * retrieve the modified data from after the {@link Update} or + * {@link Insert} statement was applied. + *

+ * This includes trigger generated values. + */ + @NotNull + @Support({ H2, POSTGRES }) + public static Table finalTable(Merge query) { return new DataChangeDeltaTable<>(ResultOption.FINAL, query); } diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 208de331c8..581f6fd762 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -174,6 +174,7 @@ import org.jooq.DSLContext; import org.jooq.DataType; import org.jooq.DatePart; // ... +import org.jooq.Delete; import org.jooq.DeleteLimitStep; import org.jooq.DeleteOrderByStep; import org.jooq.DeleteReturningStep; @@ -200,6 +201,7 @@ import org.jooq.GroupConcatSeparatorStep; import org.jooq.GroupField; // ... import org.jooq.Index; +import org.jooq.Insert; import org.jooq.InsertOnConflictDoUpdateStep; import org.jooq.InsertOnConflictWhereIndexPredicateStep; import org.jooq.InsertOnConflictWhereStep; @@ -276,6 +278,7 @@ import org.jooq.TablePartitionByStep; import org.jooq.Truncate; import org.jooq.TruncateCascadeStep; import org.jooq.TruncateIdentityStep; +import org.jooq.Update; import org.jooq.UpdateFromStep; import org.jooq.UpdateLimitStep; import org.jooq.UpdateOrderByStep; @@ -6140,9 +6143,50 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { - // TODO [#5306] Support FINAL TABLE () - // TODIO ONLY ( table primary ) - if (parseFunctionNameIf("UNNEST", "TABLE")) { + // TODO ONLY ( table primary ) + if (parseFunctionNameIf("OLD TABLE")) { + parse('('); + Query query = parseQuery(false, false); + parse(')'); + + if (query instanceof Merge) + result = oldTable((Merge) query); + else if (query instanceof Update) + result = oldTable((Update) query); + else if (query instanceof Delete) + result = oldTable((Delete) query); + else + throw expected("UPDATE", "DELETE", "MERGE"); + } + else if (parseFunctionNameIf("NEW TABLE")) { + parse('('); + Query query = parseQuery(false, false); + parse(')'); + + if (query instanceof Merge) + result = newTable((Merge) query); + else if (query instanceof Insert) + result = newTable((Insert) query); + else if (query instanceof Update) + result = newTable((Update) query); + else + throw expected("INSERT", "UPDATE", "MERGE"); + } + else if (parseFunctionNameIf("FINAL TABLE")) { + parse('('); + Query query = parseQuery(false, false); + parse(')'); + + if (query instanceof Merge) + result = finalTable((Merge) query); + else if (query instanceof Insert) + result = finalTable((Insert) query); + else if (query instanceof Update) + result = finalTable((Update) query); + else + throw expected("INSERT", "UPDATE", "MERGE"); + } + else if (parseFunctionNameIf("UNNEST", "TABLE")) { parse('('); if (parseFunctionNameIf("GENERATOR")) {