diff --git a/jOOQ/src/main/java/org/jooq/impl/CurrentTimestamp.java b/jOOQ/src/main/java/org/jooq/impl/CurrentTimestamp.java index 0fab26803e..ab88be238c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CurrentTimestamp.java +++ b/jOOQ/src/main/java/org/jooq/impl/CurrentTimestamp.java @@ -37,14 +37,30 @@ */ package org.jooq.impl; +// ... +// ... +import static org.jooq.SQLDialect.CUBRID; +import static org.jooq.SQLDialect.DERBY; +// ... +// ... +// ... +// ... +// ... +import static org.jooq.SQLDialect.SQLITE; +// ... +// ... import static org.jooq.impl.Keywords.F_CURRENT_BIGDATETIME; import static org.jooq.impl.Keywords.F_CURRENT_TIMESTAMP; import static org.jooq.impl.Keywords.F_NOW; import static org.jooq.impl.Keywords.K_CURRENT; import static org.jooq.impl.Keywords.K_TIMESTAMP; +import java.util.EnumSet; + import org.jooq.Context; import org.jooq.DataType; +import org.jooq.Field; +import org.jooq.SQLDialect; /** * @author Lukas Eder @@ -54,10 +70,18 @@ final class CurrentTimestamp extends AbstractField { /** * Generated UID */ - private static final long serialVersionUID = -7273879239726265322L; + private static final long serialVersionUID = -7273879239726265322L; + private static final EnumSet NO_SUPPORT_PRECISION = EnumSet.of(CUBRID, DERBY, SQLITE); + + private final Field precision; CurrentTimestamp(DataType type) { + this(null, type); + } + + CurrentTimestamp(Field precision, DataType type) { super(DSL.name("current_timestamp"), type); + this.precision = precision; } @Override @@ -96,10 +120,16 @@ final class CurrentTimestamp extends AbstractField { case HSQLDB: case POSTGRES: case SQLITE: - ctx.visit(F_CURRENT_TIMESTAMP); + if (precision != null && !NO_SUPPORT_PRECISION.contains(ctx.family())) + ctx.visit(F_CURRENT_TIMESTAMP).sql('(').visit(precision).sql(')'); + else + ctx.visit(F_CURRENT_TIMESTAMP); break; default: - ctx.visit(F_CURRENT_TIMESTAMP).sql("()"); + if (precision != null && !NO_SUPPORT_PRECISION.contains(ctx.family())) + ctx.visit(F_CURRENT_TIMESTAMP).sql('(').visit(precision).sql(')'); + else + ctx.visit(F_CURRENT_TIMESTAMP).sql("()"); break; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 262d228f59..3047a62156 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -14040,6 +14040,16 @@ public class DSL { return new CurrentTimestamp<>(SQLDataType.TIMESTAMP); } + /** + * Get the current_timestamp() function returning a SQL standard + * {@link SQLDataType#TIMESTAMP} type with the specified fractional + * seconds precision. + */ + @Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) + public static Field currentTimestamp(Field precision) { + return new CurrentTimestamp<>(precision, SQLDataType.TIMESTAMP); + } + /** * Synonym for {@link #currentTimestamp()}. */ @@ -14048,6 +14058,14 @@ public class DSL { return currentTimestamp(); } + /** + * Synonym for {@link #currentTimestamp(Field)}. + */ + @Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) + public static Field now(Field precision) { + return currentTimestamp(precision); + } + /** * Get the current_date() function returning a SQL standard diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 23dfee7bcc..d03ad6b9cf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -5555,8 +5555,15 @@ final class ParserImpl implements Parser { if (D.is(type)) if ((parseKeywordIf(ctx, "CURRENT_DATE") || parseKeywordIf(ctx, "CURRENT DATE")) && (parseIf(ctx, '(') && parse(ctx, ')') || true)) return currentDate(); - else if ((parseKeywordIf(ctx, "CURRENT_TIMESTAMP") || parseKeywordIf(ctx, "CURRENT TIMESTAMP")) && (parseIf(ctx, '(') && parse(ctx, ')') || true)) - return currentTimestamp(); + else if (parseKeywordIf(ctx, "CURRENT_TIMESTAMP") || parseKeywordIf(ctx, "CURRENT TIMESTAMP")) { + Field precision = null; + if (parseIf(ctx, '(')) + if (!parseIf(ctx, ')')) { + precision = (Field) parseField(ctx, N); + parse(ctx, ')'); + } + return precision != null ? currentTimestamp(precision) : currentTimestamp(); + } else if ((parseKeywordIf(ctx, "CURRENT_TIME") || parseKeywordIf(ctx, "CURRENT TIME")) && (parseIf(ctx, '(') && parse(ctx, ')') || true)) return currentTime(); else if (parseFunctionNameIf(ctx, "CURDATE") && parse(ctx, '(') && parse(ctx, ')')) @@ -5780,8 +5787,13 @@ final class ParserImpl implements Parser { return field; else if ((field = parseNextvalCurrvalIf(ctx, SequenceMethod.NEXTVAL)) != null) return field; - else if (parseFunctionNameIf(ctx, "NOW") && parse(ctx, '(') && parse(ctx, ')')) - return now(); + else if (parseFunctionNameIf(ctx, "NOW") && parse(ctx, '(')) { + if (parseIf(ctx, ')')) + return now(); + Field precision = (Field) parseField(ctx, N); + parse(ctx, ')'); + return now(precision); + } break;