[jOOQ/jOOQ#5306] Parser support for <data change delta table>

This commit is contained in:
Lukas Eder 2021-08-24 16:07:07 +02:00
parent 8d543f668c
commit 19dfe15341
3 changed files with 124 additions and 6 deletions

View File

@ -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;

View File

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

View File

@ -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 (<data change statement>)
// 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")) {