[jOOQ/jOOQ#15682] Patch defaults also in UPDATE .. SET

Including doing this for SQLite as well.
This commit is contained in:
Lukas Eder 2023-11-14 09:34:58 +01:00
parent d9a2f7b678
commit feffd5db90
2 changed files with 9 additions and 13 deletions

View File

@ -76,6 +76,7 @@ import static org.jooq.impl.DSL.row;
import static org.jooq.impl.DSL.select;
import static org.jooq.impl.DSL.table;
import static org.jooq.impl.DSL.when;
import static org.jooq.impl.FieldMapsForInsert.patchDefault;
import static org.jooq.impl.Keywords.K_ROW;
import static org.jooq.impl.Tools.anyMatch;
import static org.jooq.impl.Tools.apply;
@ -236,7 +237,7 @@ extends
Field<?> k = multiRow.field(i);
Field<?> v = multiValue.field(i);
map.put(k, Tools.field(v, k));
map.put(k, patchDefault(ctx, Tools.field(v, k), k));
}
ctx.visit(map);
@ -343,7 +344,7 @@ extends
else
ctx.visit(value);
ctx.visit(patchDefault(ctx, (Field) value, (Field) key));
}
if (assignmentClause != null)

View File

@ -50,6 +50,7 @@ import static org.jooq.Clause.INSERT_VALUES;
import static org.jooq.SQLDialect.POSTGRES;
// ...
// ...
import static org.jooq.SQLDialect.SQLITE;
// ...
import static org.jooq.SQLDialect.TRINO;
// ...
@ -116,10 +117,7 @@ import org.jooq.impl.Tools.ExtendedDataKey;
final class FieldMapsForInsert extends AbstractQueryPart implements UNotYetImplemented {
static final Set<SQLDialect> CASTS_NEEDED = SQLDialect.supportedBy(POSTGRES, TRINO, YUGABYTEDB);
static final Set<SQLDialect> CASTS_NEEDED_FOR_MERGE = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
static final Set<SQLDialect> NO_SUPPORT_DEFAULT_EXPRESSION = SQLDialect.supportedBy(SQLITE);
final Table<?> table;
final Map<Field<?>, Field<?>> empty;
@ -507,17 +505,14 @@ final class FieldMapsForInsert extends AbstractQueryPart implements UNotYetImple
ctx.castMode(previous);
}
private final Field<?> patchDefault(Context<?> ctx, Field<?> d, Field<?> f) {
static final Field<?> patchDefault(Context<?> ctx, Field<?> d, Field<?> f) {
if (NO_SUPPORT_DEFAULT_EXPRESSION.contains(ctx.dialect()))
return patchDefault0(d, f);
return d;
}
private final Field<?> patchDefault0(Field<?> d, Field<?> f) {
static final Field<?> patchDefault0(Field<?> d, Field<?> f) {
if (d instanceof Default)
return orElse(f.getDataType().default_(), () -> DSL.inline(null, f));