diff --git a/src/optimizer/OptimizerUtils.cpp b/src/optimizer/OptimizerUtils.cpp
index f2054a8c697cf07281326ce6b3ba78e82e5bde1e..93394ed0930e5a5ce19866130322ff45668fd89a 100644
--- a/src/optimizer/OptimizerUtils.cpp
+++ b/src/optimizer/OptimizerUtils.cpp
@@ -95,6 +95,31 @@ Value OptimizerUtils::boundValueWithGT(const meta::cpp2::ColumnDef& col, const V
             }
             return Value(d);
         }
+        case Value::Type::TIME : {
+            auto t = v.getTime();
+            // Ignore the time zone.
+            if (t.microsec < std::numeric_limits<int32_t>::max()) {
+                t.microsec = t.microsec + 1;
+            } else {
+                t.microsec = 1;
+                if (t.sec < 60) {
+                    t.sec += 1;
+                } else {
+                    t.sec = 1;
+                    if (t.minute < 60) {
+                        t.minute += 1;
+                    } else {
+                        t.minute = 1;
+                        if (t.hour < 24) {
+                            t.hour += 1;
+                        } else {
+                            return v.getTime();
+                        }
+                    }
+                }
+            }
+            return Value(t);
+        }
         case Value::Type::DATETIME : {
             auto dt = v.getDateTime();
             // Ignore the time zone.
@@ -135,10 +160,22 @@ Value OptimizerUtils::boundValueWithGT(const meta::cpp2::ColumnDef& col, const V
             }
             return Value(dt);
         }
-        default : {
+        case Value::Type::__EMPTY__:
+        case Value::Type::NULLVALUE:
+        case Value::Type::VERTEX:
+        case Value::Type::EDGE:
+        case Value::Type::LIST:
+        case Value::Type::SET:
+        case Value::Type::MAP:
+        case Value::Type::DATASET:
+        case Value::Type::PATH: {
+            DLOG(FATAL) << "Not supported value type " << type
+                        << "for index.";
             return Value(NullType::BAD_TYPE);
         }
     }
+    DLOG(FATAL) << "Unknown value type " << static_cast<int>(type);
+    return Value(NullType::BAD_TYPE);
 }
 
 Value OptimizerUtils::boundValueWithLT(const meta::cpp2::ColumnDef& col, const Value& v) {
@@ -203,6 +240,33 @@ Value OptimizerUtils::boundValueWithLT(const meta::cpp2::ColumnDef& col, const V
             }
             return Value(d);
         }
+        case Value::Type::TIME : {
+            if (Time() == v.getTime()) {
+                return v.getTime();
+            }
+            auto t = v.getTime();
+            if (t.microsec > 1) {
+                t.microsec -= 1;
+            } else {
+                t.microsec = std::numeric_limits<int32_t>::max();
+                if (t.sec > 1) {
+                    t.sec -= 1;
+                } else {
+                    t.sec = 60;
+                    if (t.minute > 1) {
+                        t.minute -= 1;
+                    } else {
+                        t.minute = 60;
+                        if (t.hour > 1) {
+                            t.hour -= 1;
+                        } else {
+                            return v.getTime();
+                        }
+                    }
+                }
+            }
+            return Value(t);
+        }
         case Value::Type::DATETIME : {
             if (DateTime() == v.getDateTime()) {
                 return v.getDateTime();
@@ -245,9 +309,22 @@ Value OptimizerUtils::boundValueWithLT(const meta::cpp2::ColumnDef& col, const V
             }
             return Value(dt);
         }
-        default :
+        case Value::Type::__EMPTY__:
+        case Value::Type::NULLVALUE:
+        case Value::Type::VERTEX:
+        case Value::Type::EDGE:
+        case Value::Type::LIST:
+        case Value::Type::SET:
+        case Value::Type::MAP:
+        case Value::Type::DATASET:
+        case Value::Type::PATH: {
+            DLOG(FATAL) << "Not supported value type " << type
+                        << "for index.";
             return Value(NullType::BAD_TYPE);
+        }
     }
+    DLOG(FATAL) << "Unknown value type " << static_cast<int>(type);
+    return Value(NullType::BAD_TYPE);
 }
 
 Value OptimizerUtils::boundValueWithMax(const meta::cpp2::ColumnDef& col, const Value& v) {
@@ -275,7 +352,15 @@ Value OptimizerUtils::boundValueWithMax(const meta::cpp2::ColumnDef& col, const
             d.day = 31;
             return Value(d);
         }
-        case Value::Type::DATETIME : {
+        case Value::Type::TIME: {
+            Time dt;
+            dt.hour = 24;
+            dt.minute = 60;
+            dt.sec = 60;
+            dt.microsec = std::numeric_limits<int32_t>::max();
+            return Value(dt);
+        }
+        case Value::Type::DATETIME: {
             DateTime dt;
             dt.year = std::numeric_limits<int16_t>::max();
             dt.month = 12;
@@ -286,9 +371,22 @@ Value OptimizerUtils::boundValueWithMax(const meta::cpp2::ColumnDef& col, const
             dt.microsec = std::numeric_limits<int32_t>::max();
             return Value(dt);
         }
-        default :
+        case Value::Type::__EMPTY__:
+        case Value::Type::NULLVALUE:
+        case Value::Type::VERTEX:
+        case Value::Type::EDGE:
+        case Value::Type::LIST:
+        case Value::Type::SET:
+        case Value::Type::MAP:
+        case Value::Type::DATASET:
+        case Value::Type::PATH: {
+            DLOG(FATAL) << "Not supported value type " << type
+                        << "for index.";
             return Value(NullType::BAD_TYPE);
+        }
     }
+    DLOG(FATAL) << "Unknown value type " << static_cast<int>(type);
+    return Value(NullType::BAD_TYPE);
 }
 
 Value OptimizerUtils::boundValueWithMin(const meta::cpp2::ColumnDef& col, const Value& v) {
@@ -312,12 +410,28 @@ Value OptimizerUtils::boundValueWithMin(const meta::cpp2::ColumnDef& col, const
         case Value::Type::DATE : {
             return Value(Date());
         }
+        case Value::Type::TIME: {
+            return Value(Time());
+        }
         case Value::Type::DATETIME : {
             return Value(DateTime());
         }
-        default :
+        case Value::Type::__EMPTY__:
+        case Value::Type::NULLVALUE:
+        case Value::Type::VERTEX:
+        case Value::Type::EDGE:
+        case Value::Type::LIST:
+        case Value::Type::SET:
+        case Value::Type::MAP:
+        case Value::Type::DATASET:
+        case Value::Type::PATH: {
+            DLOG(FATAL) << "Not supported value type " << type
+                        << "for index.";
             return Value(NullType::BAD_TYPE);
+        }
     }
+    DLOG(FATAL) << "Unknown value type " << static_cast<int>(type);
+    return Value(NullType::BAD_TYPE);
 }
 
 }  // namespace graph
diff --git a/tests/common/nebula_test_suite.py b/tests/common/nebula_test_suite.py
index a598e6b63a8c80a5dd38ecf6a149824f96288990..47149c1e21bb6c43990b4cc7d6a3070e6c5eb008 100644
--- a/tests/common/nebula_test_suite.py
+++ b/tests/common/nebula_test_suite.py
@@ -258,6 +258,7 @@ class NebulaTestSuite(object):
                                              date_time.minute,
                                              date_time.sec,
                                              date_time.microsec)
+
     @classmethod
     def map_to_string(self, map):
         kvStrs = []