You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2019/07/10 08:44:14 UTC

[empire-db] branch master updated: EMPIREDB-293: Distinguish DATETIME and TIMESTAMP

This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/master by this push:
     new abc0623  EMPIREDB-293: Distinguish DATETIME and TIMESTAMP
abc0623 is described below

commit abc06236a6480f88579a5f4278f78bde01340b16
Author: Rainer Döbele <do...@apache.org>
AuthorDate: Wed Jul 10 10:44:09 2019 +0200

    EMPIREDB-293: Distinguish DATETIME and TIMESTAMP
---
 .../org/apache/empire/commons/ObjectUtils.java     |  15 ++
 .../org/apache/empire/db/DBDatabaseDriver.java     |  29 ++--
 .../empire/db/derby/DBDatabaseDriverDerby.java     |   4 +-
 .../apache/empire/db/h2/DBDatabaseDriverH2.java    |   4 +-
 .../empire/db/hsql/DBDatabaseDriverHSql.java       |   4 +-
 .../empire/db/mysql/DBDatabaseDriverMySQL.java     |   4 +-
 .../empire/db/oracle/DBDatabaseDriverOracle.java   |  15 +-
 .../db/postgresql/DBDatabaseDriverPostgreSQL.java  |   4 +-
 .../empire/db/sqlite/DBDatabaseDriverSQLite.java   | 161 ++++++++-------------
 .../empire/db/sqlserver/DBDatabaseDriverMSSQL.java |   5 +-
 10 files changed, 119 insertions(+), 126 deletions(-)

diff --git a/empire-db/src/main/java/org/apache/empire/commons/ObjectUtils.java b/empire-db/src/main/java/org/apache/empire/commons/ObjectUtils.java
index b10066e..8884c3a 100644
--- a/empire-db/src/main/java/org/apache/empire/commons/ObjectUtils.java
+++ b/empire-db/src/main/java/org/apache/empire/commons/ObjectUtils.java
@@ -90,6 +90,21 @@ public final class ObjectUtils
     }
     
     /**
+     * returns the string length of an object
+     * @param o the object to check
+     * @return the string length of the object
+     */
+    public static int lengthOf(Object o)
+    {
+        if (o==null || o==ObjectUtils.NO_VALUE)
+            return 0;
+        if ((o instanceof String))
+            return ((String)o).length();
+        // convert
+        return o.toString().length();
+    }
+    
+    /**
      * Compares two objects for equality 
      * 
      * @param o1 the first object
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java b/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
index f7f05f3..b8bef1d 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
@@ -63,14 +63,16 @@ public abstract class DBDatabaseDriver implements Serializable
     public static final int SQL_CONCAT_EXPR      = 8;   // Oracle: ||
     public static final int SQL_PSEUDO_TABLE     = 9;   // Oracle: "DUAL"
     // data types
-    public static final int SQL_BOOLEAN_TRUE     = 10;  // Oracle: "'Y'"; MSSQL: "1"
-    public static final int SQL_BOOLEAN_FALSE    = 11;  // Oracle: "'N'"; MSSQL: "0"
-    public static final int SQL_CURRENT_DATE     = 20;  // Oracle: "sysdate"
-    public static final int SQL_DATE_PATTERN     = 21;  // "yyyy.MM.dd"
-    public static final int SQL_DATE_TEMPLATE    = 22;  // Oracle: "TO_DATE('{0}', 'YYYY-MM-DD')"
-    public static final int SQL_CURRENT_DATETIME = 25;  // Oracle: "sysdate"
-    public static final int SQL_DATETIME_PATTERN = 26;  // "yyyy.MM.dd HH:mm:ss"
-    public static final int SQL_DATETIME_TEMPLATE= 27;  // Oracle: "TO_DATE('{0}', 'YYYY-MM-DD HH24:MI:SS')"
+    public static final int SQL_BOOLEAN_TRUE      = 10; // Oracle: "'Y'"; MSSQL: "1"
+    public static final int SQL_BOOLEAN_FALSE     = 11; // Oracle: "'N'"; MSSQL: "0"
+    public static final int SQL_CURRENT_DATE      = 20; // Oracle: "sysdate"
+    public static final int SQL_DATE_PATTERN      = 21; // "yyyy-MM-dd"  // SimpleDateFormat
+    public static final int SQL_DATE_TEMPLATE     = 22; // Oracle: "TO_DATE('{0}', 'YYYY-MM-DD')"
+    public static final int SQL_DATETIME_PATTERN  = 23; // "yyyy-MM-dd HH:mm:ss.SSS"  // SimpleDateFormat
+    public static final int SQL_DATETIME_TEMPLATE = 24; // Oracle: "TO_DATE('{0}', 'YYYY-MM-DD HH24:MI:SS')"
+    public static final int SQL_CURRENT_TIMESTAMP = 25; // Oracle: "systimestamp"
+    public static final int SQL_TIMESTAMP_PATTERN = 26; // "yyyy-MM-dd HH:mm:ss.SSS" // SimpleDateFormat
+    public static final int SQL_TIMESTAMP_TEMPLATE= 27; // Oracle: "TO_TIMESTAMP('{0}', 'YYYY.MM.DD HH24:MI:SS.FF')";
     // functions
     public static final int SQL_FUNC_COALESCE    = 100; // Oracle: nvl(?, {0})
     public static final int SQL_FUNC_SUBSTRING   = 101; // Oracle: substr(?,{0})
@@ -721,12 +723,13 @@ public abstract class DBDatabaseDriver implements Serializable
             case DATE:
                 return getSQLDateTimeString(value, SQL_DATE_TEMPLATE, SQL_DATE_PATTERN, SQL_CURRENT_DATE);
             case DATETIME:
-            case TIMESTAMP:
-                // System date is special case
-                if (!DBDatabase.SYSDATE.equals(value) && value.toString().length()<=10)
-                    return getSQLDateTimeString(value, SQL_DATE_TEMPLATE, SQL_DATE_PATTERN, SQL_CURRENT_DATETIME);
+                // Only date (without time) provided?
+                if (!DBDatabase.SYSDATE.equals(value) && ObjectUtils.lengthOf(value)<=10)
+                    return getSQLDateTimeString(value, SQL_DATE_TEMPLATE, SQL_DATE_PATTERN, SQL_CURRENT_TIMESTAMP);
                 // Complete Date-Time Object with time 
-                return getSQLDateTimeString(value, SQL_DATETIME_TEMPLATE, SQL_DATETIME_PATTERN, SQL_CURRENT_DATETIME);
+                return getSQLDateTimeString(value, SQL_DATETIME_TEMPLATE, SQL_DATETIME_PATTERN, SQL_CURRENT_TIMESTAMP);
+            case TIMESTAMP:
+                return getSQLDateTimeString(value, SQL_TIMESTAMP_TEMPLATE, SQL_TIMESTAMP_PATTERN, SQL_CURRENT_TIMESTAMP);
             case TEXT:
             case VARCHAR:
             case CHAR:
diff --git a/empire-db/src/main/java/org/apache/empire/db/derby/DBDatabaseDriverDerby.java b/empire-db/src/main/java/org/apache/empire/db/derby/DBDatabaseDriverDerby.java
index 86352f6..e60b6a8 100644
--- a/empire-db/src/main/java/org/apache/empire/db/derby/DBDatabaseDriverDerby.java
+++ b/empire-db/src/main/java/org/apache/empire/db/derby/DBDatabaseDriverDerby.java
@@ -194,9 +194,11 @@ public class DBDatabaseDriverDerby extends DBDatabaseDriver
             case SQL_CURRENT_DATE:            return "CURRENT_DATE()";
             case SQL_DATE_PATTERN:            return "yyyy-MM-dd";
             case SQL_DATE_TEMPLATE:           return "'{0}'";
-            case SQL_CURRENT_DATETIME:        return "CURRENT_TIMESTAMP";
             case SQL_DATETIME_PATTERN:        return "yyyy-MM-dd HH:mm:ss";
             case SQL_DATETIME_TEMPLATE:       return "'{0}'";
+            case SQL_CURRENT_TIMESTAMP:       return "CURRENT_TIMESTAMP";
+            case SQL_TIMESTAMP_PATTERN:       return "yyyy-MM-dd HH:mm:ss";
+            case SQL_TIMESTAMP_TEMPLATE:      return "'{0}'";
             // functions
             case SQL_FUNC_COALESCE:           return "coalesce(?, {0})";
             case SQL_FUNC_SUBSTRING:          return "substr(?, {0})";
diff --git a/empire-db/src/main/java/org/apache/empire/db/h2/DBDatabaseDriverH2.java b/empire-db/src/main/java/org/apache/empire/db/h2/DBDatabaseDriverH2.java
index 09342fd..5b168ba 100644
--- a/empire-db/src/main/java/org/apache/empire/db/h2/DBDatabaseDriverH2.java
+++ b/empire-db/src/main/java/org/apache/empire/db/h2/DBDatabaseDriverH2.java
@@ -241,9 +241,11 @@ public class DBDatabaseDriverH2 extends DBDatabaseDriver
             case SQL_CURRENT_DATE:            return "CURRENT_DATE()";
             case SQL_DATE_PATTERN:            return "yyyy-MM-dd";
             case SQL_DATE_TEMPLATE:           return "'{0}'";
-            case SQL_CURRENT_DATETIME:        return "NOW()";
             case SQL_DATETIME_PATTERN:        return "yyyy-MM-dd HH:mm:ss";
             case SQL_DATETIME_TEMPLATE:       return "'{0}'";
+            case SQL_CURRENT_TIMESTAMP:       return "NOW()";
+            case SQL_TIMESTAMP_PATTERN:       return "yyyy-MM-dd HH:mm:ss";
+            case SQL_TIMESTAMP_TEMPLATE:      return "'{0}'";
             // functions
             case SQL_FUNC_COALESCE:           return "coalesce(?, {0})";
             case SQL_FUNC_SUBSTRING:          return "substring(?, {0})";
diff --git a/empire-db/src/main/java/org/apache/empire/db/hsql/DBDatabaseDriverHSql.java b/empire-db/src/main/java/org/apache/empire/db/hsql/DBDatabaseDriverHSql.java
index 0c45e13..1ae3104 100644
--- a/empire-db/src/main/java/org/apache/empire/db/hsql/DBDatabaseDriverHSql.java
+++ b/empire-db/src/main/java/org/apache/empire/db/hsql/DBDatabaseDriverHSql.java
@@ -133,9 +133,11 @@ public class DBDatabaseDriverHSql extends DBDatabaseDriver
             case SQL_CURRENT_DATE:      return "CURRENT_DATE";
             case SQL_DATE_PATTERN:      return "yyyy-MM-dd";
             case SQL_DATE_TEMPLATE:     return "'{0}'";
-            case SQL_CURRENT_DATETIME:  return "CURRENT_TIMESTAMP";
             case SQL_DATETIME_PATTERN:  return "yyyy-MM-dd HH:mm:ss.S";
             case SQL_DATETIME_TEMPLATE: return "'{0}'";
+            case SQL_CURRENT_TIMESTAMP: return "CURRENT_TIMESTAMP";
+            case SQL_TIMESTAMP_PATTERN: return "yyyy-MM-dd HH:mm:ss.S";
+            case SQL_TIMESTAMP_TEMPLATE:return "'{0}'";
             // functions
             case SQL_FUNC_COALESCE:     return "coalesce(?, {0})";
             case SQL_FUNC_SUBSTRING:    return "substr(?, {0})";
diff --git a/empire-db/src/main/java/org/apache/empire/db/mysql/DBDatabaseDriverMySQL.java b/empire-db/src/main/java/org/apache/empire/db/mysql/DBDatabaseDriverMySQL.java
index d366632..7b57ba5 100644
--- a/empire-db/src/main/java/org/apache/empire/db/mysql/DBDatabaseDriverMySQL.java
+++ b/empire-db/src/main/java/org/apache/empire/db/mysql/DBDatabaseDriverMySQL.java
@@ -1001,9 +1001,11 @@ public class DBDatabaseDriverMySQL extends DBDatabaseDriver
             case SQL_CURRENT_DATE:            return "CURRENT_DATE()";
             case SQL_DATE_PATTERN:            return "yyyy-MM-dd";
             case SQL_DATE_TEMPLATE:           return "'{0}'";
-            case SQL_CURRENT_DATETIME:        return "NOW()";
             case SQL_DATETIME_PATTERN:        return "yyyy-MM-dd HH:mm:ss";
             case SQL_DATETIME_TEMPLATE:       return "'{0}'";
+            case SQL_CURRENT_TIMESTAMP:       return "NOW()";
+            case SQL_TIMESTAMP_PATTERN:       return "yyyy-MM-dd HH:mm:ss";
+            case SQL_TIMESTAMP_TEMPLATE:      return "'{0}'";
             // functions
             case SQL_FUNC_COALESCE:           return "coalesce(?, {0})";
             case SQL_FUNC_SUBSTRING:          return "substring(?, {0})";
diff --git a/empire-db/src/main/java/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java b/empire-db/src/main/java/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java
index 9161ca4..7be62db 100644
--- a/empire-db/src/main/java/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java
+++ b/empire-db/src/main/java/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java
@@ -162,9 +162,11 @@ public class DBDatabaseDriverOracle extends DBDatabaseDriver
             case SQL_CURRENT_DATE:              return "sysdate";
             case SQL_DATE_PATTERN:              return "yyyy-MM-dd";
             case SQL_DATE_TEMPLATE:             return "TO_DATE('{0}', 'YYYY-MM-DD')";
-            case SQL_CURRENT_DATETIME:          return "sysdate";
-            case SQL_DATETIME_PATTERN:          return "yyyy-MM-dd HH:mm:ss";
+            case SQL_DATETIME_PATTERN:          return "yyyy-MM-dd HH:mm:ss.SSS";
             case SQL_DATETIME_TEMPLATE:         return "TO_DATE('{0}', 'YYYY-MM-DD HH24:MI:SS')";
+            case SQL_CURRENT_TIMESTAMP:         return "systimestamp";
+            case SQL_TIMESTAMP_PATTERN:         return "yyyy-MM-dd HH:mm:ss.SSS";
+            case SQL_TIMESTAMP_TEMPLATE:        return "TO_TIMESTAMP('{0}', 'YYYY.MM.DD HH24:MI:SS.FF')";
             // functions
             case SQL_FUNC_COALESCE:             return "nvl(?, {0})";
             case SQL_FUNC_SUBSTRING:            return "substr(?, {0})";
@@ -243,12 +245,17 @@ public class DBDatabaseDriverOracle extends DBDatabaseDriver
             // Convert to date
             case DATE:
             case DATETIME:
-            case TIMESTAMP:
                 if (format != null)
                 { // Convert using a format string
                     return "to_date(?, '"+format.toString()+"')";
                 }
                 return "to_date(?)";
+            case TIMESTAMP:
+                if (format != null)
+                { // Convert using a format string
+                    return "to_timestamp(?, '"+format.toString()+"')";
+                }
+                return "to_timestamp(?)";
             // Unknown Type
             default:
                 log.error("getConvertPhrase: unknown type " + destType);
@@ -349,7 +356,7 @@ public class DBDatabaseDriverOracle extends DBDatabaseDriver
         ResultSet rs = null;
         try
         {   // Oracle Timestamp query
-            rs = executeQuery("select sysdate from dual", null, false, conn);
+            rs = executeQuery("SELECT systimestamp FROM DUAL", null, false, conn);
             return (rs.next() ? rs.getTimestamp(1) : null);
         } catch (SQLException e) {
             // throw exception
diff --git a/empire-db/src/main/java/org/apache/empire/db/postgresql/DBDatabaseDriverPostgreSQL.java b/empire-db/src/main/java/org/apache/empire/db/postgresql/DBDatabaseDriverPostgreSQL.java
index 0bb4732..ce279b5 100644
--- a/empire-db/src/main/java/org/apache/empire/db/postgresql/DBDatabaseDriverPostgreSQL.java
+++ b/empire-db/src/main/java/org/apache/empire/db/postgresql/DBDatabaseDriverPostgreSQL.java
@@ -341,9 +341,11 @@ public class DBDatabaseDriverPostgreSQL extends DBDatabaseDriver
             case SQL_CURRENT_DATE:            return "CURRENT_DATE";
             case SQL_DATE_PATTERN:            return "yyyy-MM-dd";
             case SQL_DATE_TEMPLATE:           return "'{0}'";
-            case SQL_CURRENT_DATETIME:        return "NOW()";
             case SQL_DATETIME_PATTERN:        return "yyyy-MM-dd HH:mm:ss";
             case SQL_DATETIME_TEMPLATE:       return "'{0}'";
+            case SQL_CURRENT_TIMESTAMP:       return "NOW()";
+            case SQL_TIMESTAMP_PATTERN:       return "yyyy-MM-dd HH:mm:ss";
+            case SQL_TIMESTAMP_TEMPLATE:      return "'{0}'";
             // functions
             case SQL_FUNC_COALESCE:           return "coalesce(?, {0})";
             case SQL_FUNC_SUBSTRING:          return "substring(?, {0})";
diff --git a/empire-db/src/main/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLite.java b/empire-db/src/main/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLite.java
index 2b6c935..a516c1e 100644
--- a/empire-db/src/main/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLite.java
+++ b/empire-db/src/main/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLite.java
@@ -306,109 +306,64 @@ public class DBDatabaseDriverSQLite extends DBDatabaseDriver
     {
         switch (phrase)
         {
-        
-        // sql-phrases
-            case SQL_NULL_VALUE:
-                return "null";
-            case SQL_PARAMETER:
-                return " ? ";
-            case SQL_RENAME_TABLE:
-                return " ";
-            case SQL_RENAME_COLUMN:
-                return " AS ";
-            case SQL_DATABASE_LINK:
-                return "@";
-            case SQL_QUOTES_OPEN:
-                return "`";
-            case SQL_QUOTES_CLOSE:
-                return "`";
-            case SQL_CONCAT_EXPR:
-                return "concat(?, {0})";
-                // data types
-            case SQL_BOOLEAN_TRUE:
-                return "1";
-            case SQL_BOOLEAN_FALSE:
-                return "0";
-            case SQL_CURRENT_DATE:
-                return "SELECT date('now','localtime');";
-            case SQL_DATE_PATTERN:
-                return "yyyy-MM-dd";
-            case SQL_DATE_TEMPLATE:
-                return "'{0}'";
-            case SQL_CURRENT_DATETIME:
-                return "NOW()";
-            case SQL_DATETIME_PATTERN:
-                return "yyyy-MM-dd hh:mm:ss.sss";
-            case SQL_DATETIME_TEMPLATE:
-                return "'{0}'";
-                // functions
-            case SQL_FUNC_COALESCE:
-                return "coalesce(?, {0})";
-            case SQL_FUNC_SUBSTRING:
-                return "substring(?, {0})";
-            case SQL_FUNC_SUBSTRINGEX:
-                return "substring(?, {0}, {1})";
-            case SQL_FUNC_REPLACE:
-                return "replace(?, {0}, {1})";
-            case SQL_FUNC_REVERSE:
-                return "reverse(?)";
-            case SQL_FUNC_STRINDEX:
-                return "instr(?, {0})";
-            case SQL_FUNC_STRINDEXFROM:
-                return "locate({0}, ?, {1})";
-            case SQL_FUNC_LENGTH:
-                return "length(?)";
-            case SQL_FUNC_UPPER:
-                return "upper(?)";
-            case SQL_FUNC_LOWER:
-                return "lcase(?)";
-            case SQL_FUNC_TRIM:
-                return "trim(?)";
-            case SQL_FUNC_LTRIM:
-                return "ltrim(?)";
-            case SQL_FUNC_RTRIM:
-                return "rtrim(?)";
-            case SQL_FUNC_ESCAPE:
-                return "? escape '{0}'";
-                // Numeric
-            case SQL_FUNC_ABS:
-                return "abs(?)";
-            case SQL_FUNC_ROUND:
-                return "round(?,{0})";
-            case SQL_FUNC_TRUNC:
-                return "truncate(?,{0})";
-            case SQL_FUNC_CEILING:
-                return "ceiling(?)";
-            case SQL_FUNC_FLOOR:
-                return "floor(?)";
-            case SQL_FUNC_MODULO:               
-                return "mod(?,{0})";
-                // Date
-            case SQL_FUNC_DAY:
-                return "day(?)";
-            case SQL_FUNC_MONTH:
-                return "month(?)";
-            case SQL_FUNC_YEAR:
-                return "year(?)";
-                // Aggregation
-            case SQL_FUNC_SUM:
-                return "sum(?)";
-            case SQL_FUNC_MAX:
-                return "max(?)";
-            case SQL_FUNC_MIN:
-                return "min(?)";
-            case SQL_FUNC_AVG:
-                return "avg(?)";
-                // Others
-            case SQL_FUNC_DECODE:
-                return "case ? {0} end";
-            case SQL_FUNC_DECODE_SEP:
-                return " ";
-            case SQL_FUNC_DECODE_PART:
-                return "when {0} then {1}";
-            case SQL_FUNC_DECODE_ELSE:
-                return "else {0}";
-                // Not defined
+
+            // sql-phrases
+            case SQL_NULL_VALUE:            return "null";
+            case SQL_PARAMETER:             return " ? ";
+            case SQL_RENAME_TABLE:          return " ";
+            case SQL_RENAME_COLUMN:         return " AS ";
+            case SQL_DATABASE_LINK:         return "@";
+            case SQL_QUOTES_OPEN:           return "`";
+            case SQL_QUOTES_CLOSE:          return "`";
+            case SQL_CONCAT_EXPR:           return "concat(?, {0})";
+            // data types
+            case SQL_BOOLEAN_TRUE:          return "1";
+            case SQL_BOOLEAN_FALSE:         return "0";
+            case SQL_CURRENT_DATE:          return "SELECT date('now','localtime');";
+            case SQL_DATE_PATTERN:          return "yyyy-MM-dd";
+            case SQL_DATE_TEMPLATE:         return "'{0}'";
+            case SQL_DATETIME_PATTERN:      return "yyyy-MM-dd hh:mm:ss.sss";
+            case SQL_DATETIME_TEMPLATE:     return "'{0}'";
+            case SQL_CURRENT_TIMESTAMP:     return "NOW()";
+            case SQL_TIMESTAMP_PATTERN:     return "yyyy-MM-dd hh:mm:ss.sss";
+            case SQL_TIMESTAMP_TEMPLATE:    return "'{0}'";
+            // functions
+            case SQL_FUNC_COALESCE:         return "coalesce(?, {0})";
+            case SQL_FUNC_SUBSTRING:        return "substring(?, {0})";
+            case SQL_FUNC_SUBSTRINGEX:      return "substring(?, {0}, {1})";
+            case SQL_FUNC_REPLACE:          return "replace(?, {0}, {1})";
+            case SQL_FUNC_REVERSE:          return "reverse(?)";
+            case SQL_FUNC_STRINDEX:         return "instr(?, {0})";
+            case SQL_FUNC_STRINDEXFROM:     return "locate({0}, ?, {1})";
+            case SQL_FUNC_LENGTH:           return "length(?)";
+            case SQL_FUNC_UPPER:            return "upper(?)";
+            case SQL_FUNC_LOWER:            return "lcase(?)";
+            case SQL_FUNC_TRIM:             return "trim(?)";
+            case SQL_FUNC_LTRIM:            return "ltrim(?)";
+            case SQL_FUNC_RTRIM:            return "rtrim(?)";
+            case SQL_FUNC_ESCAPE:           return "? escape '{0}'";
+            // Numeric
+            case SQL_FUNC_ABS:              return "abs(?)";
+            case SQL_FUNC_ROUND:            return "round(?,{0})";
+            case SQL_FUNC_TRUNC:            return "truncate(?,{0})";
+            case SQL_FUNC_CEILING:          return "ceiling(?)";
+            case SQL_FUNC_FLOOR:            return "floor(?)";
+            case SQL_FUNC_MODULO:           return "mod(?,{0})";
+            // Date
+            case SQL_FUNC_DAY:              return "day(?)";
+            case SQL_FUNC_MONTH:            return "month(?)";
+            case SQL_FUNC_YEAR:             return "year(?)";
+            // Aggregation
+            case SQL_FUNC_SUM:              return "sum(?)";
+            case SQL_FUNC_MAX:              return "max(?)";
+            case SQL_FUNC_MIN:              return "min(?)";
+            case SQL_FUNC_AVG:              return "avg(?)";
+            // Others
+            case SQL_FUNC_DECODE:           return "case ? {0} end";
+            case SQL_FUNC_DECODE_SEP:       return " ";
+            case SQL_FUNC_DECODE_PART:      return "when {0} then {1}";
+            case SQL_FUNC_DECODE_ELSE:      return "else {0}";
+            // Not defined
             default:
                 log.error("SQL phrase " + String.valueOf(phrase) + " is not defined!");
                 return "";
diff --git a/empire-db/src/main/java/org/apache/empire/db/sqlserver/DBDatabaseDriverMSSQL.java b/empire-db/src/main/java/org/apache/empire/db/sqlserver/DBDatabaseDriverMSSQL.java
index 3cf55cb..be4c6e5 100644
--- a/empire-db/src/main/java/org/apache/empire/db/sqlserver/DBDatabaseDriverMSSQL.java
+++ b/empire-db/src/main/java/org/apache/empire/db/sqlserver/DBDatabaseDriverMSSQL.java
@@ -308,10 +308,13 @@ public class DBDatabaseDriverMSSQL extends DBDatabaseDriver
             case SQL_CURRENT_DATE:            return "convert(char, getdate(), 111)";
             case SQL_DATE_PATTERN:            return "yyyy-MM-dd";
             case SQL_DATE_TEMPLATE:           return "convert(date, '{0}', 111)";
-            case SQL_CURRENT_DATETIME:        return "getdate()";
             case SQL_DATETIME_PATTERN:        return "yyyy-MM-dd HH:mm:ss.SSS";
             case SQL_DATETIME_TEMPLATE:       return isUseDateTime2() ? "convert(datetime2, '{0}', 121)"
                                                                       : "convert(datetime,  '{0}', 121)";
+            case SQL_CURRENT_TIMESTAMP:       return "getdate()";
+            case SQL_TIMESTAMP_PATTERN:       return "yyyy-MM-dd HH:mm:ss.SSS";
+            case SQL_TIMESTAMP_TEMPLATE:      return isUseDateTime2() ? "convert(datetime2, '{0}', 121)"
+                                                                      : "convert(datetime,  '{0}', 121)";
             // functions
             case SQL_FUNC_COALESCE:           return "coalesce(?, {0})";
             case SQL_FUNC_SUBSTRING:          return "substring(?, {0}, 4000)";