From a6a23970cead67c1ff195553deabda0cd9147620 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Fri, 30 Nov 2018 15:29:10 +0100 Subject: [PATCH] [#7489] Datetime arithmetic generates bind values when input uses inline values --- .../main/java/org/jooq/impl/Expression.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Expression.java b/jOOQ/src/main/java/org/jooq/impl/Expression.java index 1423cda3db..2fbf03e15d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Expression.java +++ b/jOOQ/src/main/java/org/jooq/impl/Expression.java @@ -261,6 +261,15 @@ final class Expression extends AbstractFunction { this.rhs = rhs; } + private final Field p(U u) { + Param result = val(u); + + if (((Param) rhs).isInline()) + result.setInline(true); + + return result; + } + @Override final Field getFunction0(Configuration configuration) { if (rhs.getDataType().isInterval()) @@ -273,9 +282,9 @@ final class Expression extends AbstractFunction { YearToSecond yts = rhsAsYTS(); return new DateExpression( - new DateExpression(lhs, operator, val(yts.getYearToMonth())), + new DateExpression(lhs, operator, p(yts.getYearToMonth())), operator, - val(yts.getDayToSecond()) + p(yts.getDayToSecond()) ); } @@ -323,12 +332,12 @@ final class Expression extends AbstractFunction { if (rhs.getType() == YearToMonth.class) result = DSL.field("{fn {timestampadd}({sql_tsi_month}, {0}, {1}) }", - getDataType(), val(sign * rhsAsYTM().intValue()), lhs); + getDataType(), p(sign * rhsAsYTM().intValue()), lhs); else result = DSL.field("{fn {timestampadd}({sql_tsi_second}, {0}, {fn {timestampadd}({sql_tsi_milli_second}, {1}, {2}) }) }", getDataType(), - val(sign * (long) rhsAsDTS().getTotalSeconds()), - val(sign * (long) rhsAsDTS().getMilli()), + p(sign * (long) rhsAsDTS().getTotalSeconds()), + p(sign * (long) rhsAsDTS().getMilli()), lhs); // [#1883] TIMESTAMPADD returns TIMESTAMP columns. If this @@ -340,18 +349,18 @@ final class Expression extends AbstractFunction { if (rhs.getType() == YearToSecond.class) return getYTSExpression(configuration); else if (rhs.getType() == YearToMonth.class) - return DSL.field("{dateadd}({month}, {0}, {1})", getDataType(), val(sign * rhsAsYTM().intValue()), lhs); + return DSL.field("{dateadd}({month}, {0}, {1})", getDataType(), p(sign * rhsAsYTM().intValue()), lhs); else - return DSL.field("{dateadd}({millisecond}, {0}, {1})", getDataType(), val(sign * (long) rhsAsDTS().getTotalMilli()), lhs); + return DSL.field("{dateadd}({millisecond}, {0}, {1})", getDataType(), p(sign * (long) rhsAsDTS().getTotalMilli()), lhs); } case H2: { if (rhs.getType() == YearToSecond.class) return getYTSExpression(configuration); else if (rhs.getType() == YearToMonth.class) - return DSL.field("{dateadd}('month', {0}, {1})", getDataType(), val(sign * rhsAsYTM().intValue()), lhs); + return DSL.field("{dateadd}('month', {0}, {1})", getDataType(), p(sign * rhsAsYTM().intValue()), lhs); else - return DSL.field("{dateadd}('ms', {0}, {1})", getDataType(), val(sign * (long) rhsAsDTS().getTotalMilli()), lhs); + return DSL.field("{dateadd}('ms', {0}, {1})", getDataType(), p(sign * (long) rhsAsDTS().getTotalMilli()), lhs); } case SQLITE: { @@ -359,7 +368,7 @@ final class Expression extends AbstractFunction { return getYTSExpression(configuration); boolean ytm = rhs.getType() == YearToMonth.class; - Field interval = val(ytm ? rhsAsYTM().intValue() : rhsAsDTS().getTotalSeconds()); + Field interval = p(ytm ? rhsAsYTM().intValue() : rhsAsDTS().getTotalSeconds()); if (sign < 0) interval = interval.neg();