diff --git a/jOOQ/src/main/java/org/jooq/impl/GenerateSeries.java b/jOOQ/src/main/java/org/jooq/impl/GenerateSeries.java index 4c3bcfeb50..c33ec51c08 100644 --- a/jOOQ/src/main/java/org/jooq/impl/GenerateSeries.java +++ b/jOOQ/src/main/java/org/jooq/impl/GenerateSeries.java @@ -82,47 +82,47 @@ final class GenerateSeries extends AbstractTable> implements Au + private final Field from; + private final Field to; + private final Field step; + GenerateSeries(Field from, Field to) { + this(from, to, null); + } + GenerateSeries(Field from, Field to, Field step) { + super(TableOptions.expression(), N_GENERATE_SERIES); + this.from = from; + this.to = to; + this.step = step; + } + @Override + public final void accept(Context ctx) { + if (EMULATE_WITH_RECURSIVE.contains(ctx.dialect())) { + Name v = unquotedName("v"); + Field f = DSL.field(v, INTEGER); + visitSubquery( + ctx, + withRecursive(N_GENERATE_SERIES, v) + .as(select(from).unionAll(select(iadd(f, step == null ? inline(1) : step)).from(N_GENERATE_SERIES).where(f.lt(to)))) + .select(f.as(N_GENERATE_SERIES)).from(N_GENERATE_SERIES), + true + ); + } + else if (EMULATE_SYSTEM_RANGE.contains(ctx.dialect())) { + if (step == null) { + ctx.visit(N_SYSTEM_RANGE).sql('(').visit(from).sql(", ").visit(to).sql(')'); + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // Work around https://github.com/h2database/h2database/issues/3046 + else { + ctx.visit(N_SYSTEM_RANGE).sql('(').visit(from).sql(", ").visit(to).sql(", "); + ctx.paramType(INLINED, c -> c.visit(step)); + ctx.sql(')'); + } + }