From 426ec1fed967a669cb49351e1d64b37044a30356 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Sun, 19 Aug 2012 18:05:36 +0200 Subject: [PATCH] [#430] Add support for the Firebird database - Fixed DATE TIME arithmetic --- .../src/main/java/org/jooq/impl/DateDiff.java | 3 +++ .../main/java/org/jooq/impl/Expression.java | 22 +++++++++++++++++++ .../java/org/jooq/impl/TimestampDiff.java | 3 +++ .../jooq/util/firebird/FirebirdDataType.java | 9 ++++---- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DateDiff.java b/jOOQ/src/main/java/org/jooq/impl/DateDiff.java index ed9dc8a61c..7c55504ad4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DateDiff.java +++ b/jOOQ/src/main/java/org/jooq/impl/DateDiff.java @@ -82,6 +82,9 @@ class DateDiff extends AbstractFunction { case DERBY: return field("{fn {timestampdiff}({sql_tsi_day}, {0}, {1}) }", getDataType(), date2, date1); + case FIREBIRD: + return field("{datediff}(day, {0}, {1})", getDataType(), date2, date1); + case H2: case HSQLDB: return field("{datediff}('day', {0}, {1})", getDataType(), date2, date1); diff --git a/jOOQ/src/main/java/org/jooq/impl/Expression.java b/jOOQ/src/main/java/org/jooq/impl/Expression.java index 65470f57c7..6305fbac62 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Expression.java +++ b/jOOQ/src/main/java/org/jooq/impl/Expression.java @@ -129,6 +129,10 @@ class Expression extends AbstractFunction { final Field getFunction0(Configuration configuration) { SQLDialect dialect = configuration.getDialect(); + // --------------------------------------------------------------------- + // XXX: Bitwise operators + // --------------------------------------------------------------------- + // DB2, H2 and HSQLDB know functions, instead of operators if (BIT_AND == operator && asList(DB2, H2, HSQLDB, ORACLE).contains(dialect)) { return function("bitand", getDataType(), getArguments()); @@ -188,6 +192,10 @@ class Expression extends AbstractFunction { return (Field) bitNot(bitXor(lhsAsNumber(), rhsAsNumber())); } + // --------------------------------------------------------------------- + // XXX: Date time arithmetic operators + // --------------------------------------------------------------------- + // [#585] Date time arithmetic for numeric or interval RHS else if (asList(ADD, SUBTRACT).contains(operator) && lhs.getDataType().isDateTime() && @@ -197,6 +205,10 @@ class Expression extends AbstractFunction { return new DateExpression(); } + // --------------------------------------------------------------------- + // XXX: Other operators + // --------------------------------------------------------------------- + // Use the default operator expression for all other cases else { return new DefaultExpression(); @@ -362,6 +374,15 @@ class Expression extends AbstractFunction { } } + case FIREBIRD: { + if (rhs.get(0).getType() == YearToMonth.class) { + return field("{dateadd}({month}, {0}, {1})", getDataType(), val(sign * rhsAsYTM().intValue()), lhs); + } + else { + return field("{dateadd}({millisecond}, {0}, {1})", getDataType(), val(sign * (long) rhsAsDTS().getTotalMilli()), lhs); + } + } + case H2: { if (rhs.get(0).getType() == YearToMonth.class) { return field("{dateadd}('month', {0}, {1})", getDataType(), val(sign * rhsAsYTM().intValue()), lhs); @@ -399,6 +420,7 @@ class Expression extends AbstractFunction { private final Field getNumberExpression(Configuration configuration) { switch (configuration.getDialect()) { case ASE: + case FIREBIRD: case SQLSERVER: case SYBASE: { if (operator == ADD) { diff --git a/jOOQ/src/main/java/org/jooq/impl/TimestampDiff.java b/jOOQ/src/main/java/org/jooq/impl/TimestampDiff.java index 1fc26c5c6e..6eee361d4c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TimestampDiff.java +++ b/jOOQ/src/main/java/org/jooq/impl/TimestampDiff.java @@ -97,6 +97,9 @@ class TimestampDiff extends AbstractFunction { case DERBY: return (Field) field("1000 * {fn {timestampdiff}({sql_tsi_second}, {0}, {1}) }", INTEGER, timestamp2, timestamp1); + case FIREBIRD: + return field("{datediff}(millisecond, {0}, {1})", getDataType(), timestamp2, timestamp1); + case H2: case HSQLDB: return field("{datediff}('ms', {0}, {1})", getDataType(), timestamp2, timestamp1); diff --git a/jOOQ/src/main/java/org/jooq/util/firebird/FirebirdDataType.java b/jOOQ/src/main/java/org/jooq/util/firebird/FirebirdDataType.java index 0a6f5214b6..3c4c286e66 100644 --- a/jOOQ/src/main/java/org/jooq/util/firebird/FirebirdDataType.java +++ b/jOOQ/src/main/java/org/jooq/util/firebird/FirebirdDataType.java @@ -68,15 +68,14 @@ public class FirebirdDataType extends AbstractDataType { public static final FirebirdDataType SMALLINT = new FirebirdDataType(SQLDataType.SMALLINT, "smallint"); public static final FirebirdDataType INTEGER = new FirebirdDataType(SQLDataType.INTEGER, "integer"); public static final FirebirdDataType INT = new FirebirdDataType(SQLDataType.INTEGER, "int"); - public static final FirebirdDataType INT64 = new FirebirdDataType(SQLDataType.BIGINT, "int64"); public static final FirebirdDataType BIGINT = new FirebirdDataType(SQLDataType.BIGINT, "bigint"); public static final FirebirdDataType DOUBLEPRECISION = new FirebirdDataType(SQLDataType.DOUBLE, "double precision"); public static final FirebirdDataType FLOAT = new FirebirdDataType(SQLDataType.REAL, "float"); public static final FirebirdDataType BOOLEAN = new FirebirdDataType(SQLDataType.BOOLEAN, "boolean"); public static final FirebirdDataType DECIMAL = new FirebirdDataType(SQLDataType.DECIMAL, "decimal"); public static final FirebirdDataType NUMERIC = new FirebirdDataType(SQLDataType.NUMERIC, "numeric"); - public static final FirebirdDataType VARCHAR = new FirebirdDataType(SQLDataType.VARCHAR, "varchar", "varchar(32672)"); - public static final FirebirdDataType CHARACTERVARYING = new FirebirdDataType(SQLDataType.VARCHAR, "character varying", "varchar(32672)"); + public static final FirebirdDataType VARCHAR = new FirebirdDataType(SQLDataType.VARCHAR, "varchar", "varchar(2000)"); + public static final FirebirdDataType CHARACTERVARYING = new FirebirdDataType(SQLDataType.VARCHAR, "character varying", "varchar(2000)"); public static final FirebirdDataType CHAR = new FirebirdDataType(SQLDataType.CHAR, "char"); public static final FirebirdDataType CHARACTER = new FirebirdDataType(SQLDataType.CHAR, "character"); public static final FirebirdDataType CLOB = new FirebirdDataType(SQLDataType.CLOB, "blob sub_type text"); @@ -100,10 +99,10 @@ public class FirebirdDataType extends AbstractDataType { protected static final FirebirdDataType __FLOAT = new FirebirdDataType(SQLDataType.FLOAT, "double precision"); protected static final FirebirdDataType __LONGNVARCHAR = new FirebirdDataType(SQLDataType.LONGNVARCHAR, "blob sub_type text"); protected static final FirebirdDataType __LONGVARBINARY = new FirebirdDataType(SQLDataType.LONGVARBINARY, "blob"); - protected static final FirebirdDataType __LONGVARCHAR = new FirebirdDataType(SQLDataType.LONGVARCHAR, "varchar", "varchar(32672)"); + protected static final FirebirdDataType __LONGVARCHAR = new FirebirdDataType(SQLDataType.LONGVARCHAR, "varchar", "varchar(2000)"); protected static final FirebirdDataType __NCHAR = new FirebirdDataType(SQLDataType.NCHAR, "char"); protected static final FirebirdDataType __NCLOB = new FirebirdDataType(SQLDataType.NCLOB, "clob"); - protected static final FirebirdDataType __NVARCHAR = new FirebirdDataType(SQLDataType.NVARCHAR, "varchar", "varchar(32672)"); + protected static final FirebirdDataType __NVARCHAR = new FirebirdDataType(SQLDataType.NVARCHAR, "varchar", "varchar(2000)"); protected static final FirebirdDataType __TINYINT = new FirebirdDataType(SQLDataType.TINYINT, "smallint"); protected static final FirebirdDataType __VARBINARY = new FirebirdDataType(SQLDataType.VARBINARY, "blob");