[jOOQ/jOOQ#10165] Add support for MySQL's INSERT() function

This commit is contained in:
Lukas Eder 2020-05-06 12:58:21 +02:00
parent 8f3e5343db
commit 358c4ec426
4 changed files with 51 additions and 5 deletions

View File

@ -14306,6 +14306,22 @@ public class DSL {
return new Overlay(nullSafe(in), nullSafe(placing), nullSafe(startIndex), nullSafe(length));
}
/**
* Get the insert(in, startIndex, length, placing) function.
*/
@Support
public static Field<String> insert(Field<String> in, Number startIndex, Number length, String placing) {
return insert(nullSafe(in), Tools.field(startIndex), Tools.field(length), Tools.field(placing));
}
/**
* Get the insert(in, startIndex, length, placing) function.
*/
@Support
public static Field<String> insert(Field<String> in, Field<? extends Number> startIndex, Field<? extends Number> length, Field<String> placing) {
return overlay(in, placing, startIndex, length);
}
/**
* Get the ascii(field) function.
*

View File

@ -113,6 +113,7 @@ final class Names {
static final Name N_IF = unquotedName("if");
static final Name N_IFNULL = unquotedName("ifnull");
static final Name N_IIF = unquotedName("iif");
static final Name N_INSERT = unquotedName("insert");
static final Name N_INSTR = unquotedName("instr");
static final Name N_JOIN = unquotedName("join");
static final Name N_JSON_AGG = unquotedName("json_agg");

View File

@ -62,6 +62,7 @@ import static org.jooq.impl.DSL.inline;
import static org.jooq.impl.Keywords.K_FOR;
import static org.jooq.impl.Keywords.K_FROM;
import static org.jooq.impl.Keywords.K_PLACING;
import static org.jooq.impl.Names.N_INSERT;
import static org.jooq.impl.Names.N_OVERLAY;
import java.util.Set;
@ -77,6 +78,7 @@ final class Overlay extends AbstractField<String> {
private static final long serialVersionUID = 3544690069533526544L;
private static final Set<SQLDialect> NO_SUPPORT = SQLDialect.supportedBy(DERBY, H2, HSQLDB, MARIADB, MYSQL, SQLITE);
private static final Set<SQLDialect> SUPPORT_INSERT = SQLDialect.supportedBy(MARIADB, MYSQL);
private final Field<String> in;
private final Field<String> placing;
@ -107,7 +109,10 @@ final class Overlay extends AbstractField<String> {
if (l != null) {
if (NO_SUPPORT.contains(ctx.family())) {
if (SUPPORT_INSERT.contains(ctx.dialect())) {
ctx.visit(N_INSERT).sql('(').visit(in).sql(", ").visit(startIndex).sql(", ").visit(l).sql(", ").visit(placing).sql(')');
}
else if (NO_SUPPORT.contains(ctx.dialect())) {
ctx.visit(
DSL.substring(in, inline(1), startIndex.minus(inline(1)))
.concat(placing)
@ -122,7 +127,10 @@ final class Overlay extends AbstractField<String> {
}
}
else {
if (NO_SUPPORT.contains(ctx.family())) {
if (SUPPORT_INSERT.contains(ctx.dialect())) {
ctx.visit(N_INSERT).sql('(').visit(in).sql(", ").visit(startIndex).sql(", ").visit(DSL.length(placing)).sql(", ").visit(placing).sql(')');
}
else if (NO_SUPPORT.contains(ctx.dialect())) {
ctx.visit(
DSL.substring(in, inline(1), startIndex.minus(inline(1)))
.concat(placing)

View File

@ -151,6 +151,7 @@ import static org.jooq.impl.DSL.hour;
import static org.jooq.impl.DSL.ifnull;
import static org.jooq.impl.DSL.iif;
import static org.jooq.impl.DSL.inline;
import static org.jooq.impl.DSL.insert;
import static org.jooq.impl.DSL.isnull;
import static org.jooq.impl.DSL.isoDayOfWeek;
import static org.jooq.impl.DSL.jsonEntry;
@ -5669,10 +5670,8 @@ final class ParserImpl implements Parser {
List<SelectFieldOrAsterisk> result = new ArrayList<>();
do {
if (peekKeyword(ctx, KEYWORDS_IN_SELECT))
throw ctx.exception("Select keywords must be quoted");
QualifiedAsterisk qa;
if (parseIf(ctx, '*')) {
if (parseKeywordIf(ctx, "EXCEPT")) {
parse(ctx, '(');
@ -6360,6 +6359,10 @@ final class ParserImpl implements Parser {
if ((field = parseFieldInstrIf(ctx)) != null)
return field;
if (S.is(type))
if ((field = parseFieldInsertIf(ctx)) != null)
return field;
if ((field = parseFieldIfnullIf(ctx)) != null)
return field;
else if ((field = parseFieldIsnullIf(ctx)) != null)
@ -8274,6 +8277,24 @@ final class ParserImpl implements Parser {
return null;
}
private static final Field<?> parseFieldInsertIf(ParserContext ctx) {
if (parseFunctionNameIf(ctx, "INSERT")) {
parse(ctx, '(');
Field<String> f1 = (Field) parseField(ctx, S);
parse(ctx, ',');
Field<Number> f2 = (Field) parseField(ctx, N);
parse(ctx, ',');
Field<Number> f3 = (Field) parseField(ctx, N);
parse(ctx, ',');
Field<String> f4 = (Field) parseField(ctx, S);
parse(ctx, ')');
return insert(f1, f2, f3, f4);
}
return null;
}
private static final Field<?> parseFieldOverlayIf(ParserContext ctx) {
if (parseFunctionNameIf(ctx, "OVERLAY")) {
parse(ctx, '(');