You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2015/06/16 00:42:28 UTC

[06/13] tajo git commit: TAJO-1450: Encapsulate Datum in Tuple.

TAJO-1450: Encapsulate Datum in Tuple.

Closes #596

Signed-off-by: Jihoon Son <ji...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/5c2aee23
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/5c2aee23
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/5c2aee23

Branch: refs/heads/index_support
Commit: 5c2aee2369ebcbe5d2691c346bd7cd4207b68ff4
Parents: 03294e1
Author: navis.ryu <na...@apache.org>
Authored: Tue Jun 2 11:58:12 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Tue Jun 2 11:58:12 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |   3 +
 .../org/apache/tajo/jdbc/TajoResultSetBase.java | 306 +++++++------------
 .../org/apache/tajo/storage/RowStoreUtil.java   |  48 ++-
 .../java/org/apache/tajo/datum/DateDatum.java   |  34 +--
 .../main/java/org/apache/tajo/datum/Datum.java  |   7 +
 .../org/apache/tajo/datum/DatumFactory.java     |   4 +-
 .../java/org/apache/tajo/datum/Float4Datum.java |   6 +-
 .../java/org/apache/tajo/datum/Float8Datum.java |   6 +-
 .../java/org/apache/tajo/datum/Int2Datum.java   |   6 +-
 .../java/org/apache/tajo/datum/Int4Datum.java   |   6 +-
 .../java/org/apache/tajo/datum/Int8Datum.java   |   6 +-
 .../org/apache/tajo/datum/IntervalDatum.java    |   6 +-
 .../java/org/apache/tajo/datum/TimeDatum.java   |  22 +-
 .../org/apache/tajo/datum/TimestampDatum.java   |  45 ++-
 .../org/apache/tajo/storage/EmptyTuple.java     | 141 ++++++++-
 .../java/org/apache/tajo/storage/NullTuple.java |  43 ++-
 .../java/org/apache/tajo/storage/Tuple.java     |  79 ++---
 .../java/org/apache/tajo/storage/VTuple.java    | 218 +++++++------
 .../apache/tajo/util/datetime/DateTimeUtil.java |  12 +-
 .../apache/tajo/datum/TestTimestampDatum.java   |   2 +-
 .../apache/tajo/util/TestDateTimeFormat.java    |   2 +-
 .../tajo/engine/function/builtin/AvgDouble.java |  10 +-
 .../tajo/engine/function/builtin/AvgFloat.java  |   5 +-
 .../tajo/engine/function/builtin/AvgInt.java    |   5 +-
 .../tajo/engine/function/builtin/AvgLong.java   |  10 +-
 .../tajo/engine/function/builtin/Coalesce.java  |   5 +-
 .../tajo/engine/function/builtin/CountRows.java |   2 +-
 .../engine/function/builtin/CountValue.java     |   2 +-
 .../function/builtin/CountValueDistinct.java    |  13 +-
 .../tajo/engine/function/builtin/Date.java      |   2 +-
 .../tajo/engine/function/builtin/LastValue.java |   5 +-
 .../tajo/engine/function/builtin/Lead.java      |   6 +-
 .../tajo/engine/function/builtin/Max.java       |  10 +-
 .../tajo/engine/function/builtin/Min.java       |   4 +-
 .../tajo/engine/function/builtin/RandomInt.java |   2 +-
 .../tajo/engine/function/builtin/SumDouble.java |   5 +-
 .../function/builtin/SumDoubleDistinct.java     |  10 +-
 .../tajo/engine/function/builtin/SumFloat.java  |   5 +-
 .../function/builtin/SumFloatDistinct.java      |  10 +-
 .../engine/function/builtin/SumIntDistinct.java |  10 +-
 .../tajo/engine/function/builtin/SumLong.java   |   5 +-
 .../function/builtin/SumLongDistinct.java       |  10 +-
 .../tajo/engine/function/builtin/Variance.java  |  13 +-
 .../tajo/engine/function/datetime/AddDays.java  |   4 +-
 .../engine/function/datetime/AddMonths.java     |   6 +-
 .../function/datetime/DatePartFromDate.java     |  67 ++--
 .../function/datetime/DatePartFromTime.java     |  16 +-
 .../datetime/DatePartFromTimestamp.java         |  14 +-
 .../datetime/DateTimePartFromUnixTimestamp.java |  26 +-
 .../function/datetime/ToCharTimestamp.java      |  10 +-
 .../tajo/engine/function/datetime/ToDate.java   |   6 +-
 .../function/datetime/ToTimestampInt.java       |   5 +-
 .../function/datetime/ToTimestampText.java      |   7 +-
 .../function/geoip/GeoIPCountryInet4.java       |   5 +-
 .../engine/function/geoip/GeoIPCountryText.java |   5 +-
 .../function/geoip/GeoIPInCountryInet4.java     |   6 +-
 .../function/geoip/GeoIPInCountryText.java      |   6 +-
 .../function/json/JsonExtractPathText.java      |   9 +-
 .../tajo/engine/function/math/AbsDouble.java    |   5 +-
 .../tajo/engine/function/math/AbsFloat.java     |   5 +-
 .../tajo/engine/function/math/AbsInt.java       |   5 +-
 .../tajo/engine/function/math/AbsLong.java      |   5 +-
 .../apache/tajo/engine/function/math/Acos.java  |   5 +-
 .../apache/tajo/engine/function/math/Asin.java  |   5 +-
 .../apache/tajo/engine/function/math/Atan.java  |   5 +-
 .../apache/tajo/engine/function/math/Atan2.java |   6 +-
 .../apache/tajo/engine/function/math/Cbrt.java  |   5 +-
 .../apache/tajo/engine/function/math/Ceil.java  |   5 +-
 .../apache/tajo/engine/function/math/Cos.java   |   5 +-
 .../tajo/engine/function/math/Degrees.java      |   5 +-
 .../apache/tajo/engine/function/math/Div.java   |  12 +-
 .../apache/tajo/engine/function/math/Exp.java   |   5 +-
 .../apache/tajo/engine/function/math/Floor.java |   5 +-
 .../apache/tajo/engine/function/math/Mod.java   |  12 +-
 .../apache/tajo/engine/function/math/Pow.java   |   6 +-
 .../tajo/engine/function/math/Radians.java      |   5 +-
 .../apache/tajo/engine/function/math/Round.java |   5 +-
 .../tajo/engine/function/math/RoundFloat8.java  |   9 +-
 .../apache/tajo/engine/function/math/Sign.java  |   5 +-
 .../apache/tajo/engine/function/math/Sin.java   |   5 +-
 .../apache/tajo/engine/function/math/Sqrt.java  |   5 +-
 .../apache/tajo/engine/function/math/Tan.java   |   5 +-
 .../tajo/engine/function/string/Ascii.java      |   7 +-
 .../tajo/engine/function/string/BTrim.java      |  10 +-
 .../tajo/engine/function/string/BitLength.java  |   8 +-
 .../tajo/engine/function/string/CharLength.java |   7 +-
 .../apache/tajo/engine/function/string/Chr.java |   7 +-
 .../tajo/engine/function/string/Concat.java     |   9 +-
 .../tajo/engine/function/string/Concat_ws.java  |  20 +-
 .../tajo/engine/function/string/Decode.java     |  17 +-
 .../tajo/engine/function/string/Digest.java     |   8 +-
 .../tajo/engine/function/string/Encode.java     |  18 +-
 .../tajo/engine/function/string/FindInSet.java  |  21 +-
 .../tajo/engine/function/string/InitCap.java    |   7 +-
 .../tajo/engine/function/string/LTrim.java      |  10 +-
 .../tajo/engine/function/string/Left.java       |  14 +-
 .../tajo/engine/function/string/Length.java     |   5 +-
 .../tajo/engine/function/string/Locate.java     |  15 +-
 .../tajo/engine/function/string/Lower.java      |   7 +-
 .../tajo/engine/function/string/Lpad.java       |  23 +-
 .../apache/tajo/engine/function/string/Md5.java |  11 +-
 .../engine/function/string/OctetLength.java     |   5 +-
 .../tajo/engine/function/string/QuoteIdent.java |   6 +-
 .../tajo/engine/function/string/RTrim.java      |  10 +-
 .../engine/function/string/RegexpReplace.java   |  51 ++--
 .../tajo/engine/function/string/Repeat.java     |  10 +-
 .../tajo/engine/function/string/Reverse.java    |   7 +-
 .../tajo/engine/function/string/Right.java      |  12 +-
 .../tajo/engine/function/string/Rpad.java       |  31 +-
 .../tajo/engine/function/string/SplitPart.java  |   9 +-
 .../tajo/engine/function/string/StrPos.java     |  15 +-
 .../tajo/engine/function/string/StrPosb.java    |  14 +-
 .../tajo/engine/function/string/Substr.java     |  37 +--
 .../tajo/engine/function/string/ToBin.java      |   5 +-
 .../tajo/engine/function/string/ToCharLong.java |   4 +-
 .../tajo/engine/function/string/ToHex.java      |   5 +-
 .../tajo/engine/function/string/Upper.java      |   7 +-
 .../tajo/engine/function/window/FirstValue.java |   6 +-
 .../apache/tajo/engine/function/window/Lag.java |   8 +-
 .../tajo/engine/function/window/Rank.java       |   2 +-
 .../engine/planner/RangePartitionAlgorithm.java |  66 ++--
 .../engine/planner/UniformRangePartition.java   | 208 +++++++------
 .../planner/physical/BSTIndexScanExec.java      |   3 +-
 .../planner/physical/CommonHashJoinExec.java    |   4 +-
 .../planner/physical/ComparableVector.java      |  10 +-
 .../DistinctGroupbyFirstAggregationExec.java    |  14 +-
 .../DistinctGroupbyHashAggregationExec.java     |  10 +-
 .../DistinctGroupbySecondAggregationExec.java   |   8 +-
 .../DistinctGroupbySortAggregationExec.java     |   2 +-
 .../DistinctGroupbyThirdAggregationExec.java    |  10 +-
 .../planner/physical/HashAggregateExec.java     |   4 +-
 .../HashBasedColPartitionStoreExec.java         |   4 +-
 .../engine/planner/physical/HashJoinExec.java   |   6 +-
 .../planner/physical/HashLeftOuterJoinExec.java |   3 +-
 .../planner/physical/HashPartitioner.java       |   2 +-
 .../planner/physical/JoinTupleComparator.java   |   4 +-
 .../physical/RangeShuffleFileWriteExec.java     |  23 +-
 .../planner/physical/SortAggregateExec.java     |   9 +-
 .../SortBasedColPartitionStoreExec.java         |   5 +-
 .../engine/planner/physical/WindowAggExec.java  |   8 +-
 .../org/apache/tajo/engine/utils/TupleUtil.java |   4 +-
 .../NonForwardQueryResultSystemScanner.java     |  21 +-
 .../apache/tajo/master/exec/QueryExecutor.java  |   2 +-
 .../apache/tajo/engine/eval/ExprTestBase.java   |  11 +-
 .../tajo/engine/eval/TestEvalTreeUtil.java      |   4 +-
 .../tajo/engine/eval/TestSQLExpression.java     |   7 +-
 .../planner/TestUniformRangePartition.java      | 216 ++++++-------
 .../planner/physical/TestBNLJoinExec.java       |  10 +-
 .../planner/physical/TestBSTIndexExec.java      |   4 +-
 .../planner/physical/TestExternalSortExec.java  |   2 +-
 .../physical/TestFullOuterHashJoinExec.java     |   6 +-
 .../physical/TestFullOuterMergeJoinExec.java    |   8 +-
 .../planner/physical/TestHashAntiJoinExec.java  |  10 +-
 .../planner/physical/TestHashJoinExec.java      |  10 +-
 .../planner/physical/TestHashPartitioner.java   |  10 +-
 .../planner/physical/TestHashSemiJoinExec.java  |  10 +-
 .../physical/TestLeftOuterHashJoinExec.java     |   6 +-
 .../planner/physical/TestMergeJoinExec.java     |  10 +-
 .../engine/planner/physical/TestNLJoinExec.java |  10 +-
 .../planner/physical/TestPhysicalPlanner.java   |  68 ++---
 .../physical/TestProgressExternalSortExec.java  |   2 +-
 .../physical/TestRightOuterHashJoinExec.java    |   6 +-
 .../physical/TestRightOuterMergeJoinExec.java   |   8 +-
 .../engine/planner/physical/TestSortExec.java   |   8 +-
 .../planner/physical/TestTupleSorter.java       |   4 +-
 .../apache/tajo/engine/util/TestTupleUtil.java  |  23 +-
 .../TestNonForwardQueryResultSystemScanner.java |  16 +-
 .../org/apache/tajo/storage/TestRowFile.java    |   4 +-
 .../org/apache/tajo/jdbc/MetaDataTuple.java     |  57 ++--
 .../apache/tajo/jdbc/TajoMetaDataResultSet.java |  14 +-
 .../org/apache/tajo/plan/ExprAnnotator.java     |   2 +-
 .../org/apache/tajo/plan/expr/FieldEval.java    |   2 +-
 .../plan/function/PythonAggFunctionInvoke.java  |   2 +-
 .../function/python/PythonScriptEngine.java     |   4 +-
 .../plan/function/stream/CSVLineSerializer.java |  12 +-
 .../stream/TextFieldSerializerDeserializer.java |   4 +-
 .../tajo/storage/BaseTupleComparator.java       |   4 +-
 .../storage/BinarySerializerDeserializer.java   |  52 ++--
 .../org/apache/tajo/storage/FrameTuple.java     |  76 +++--
 .../java/org/apache/tajo/storage/LazyTuple.java |  57 ++--
 .../org/apache/tajo/storage/RowStoreUtil.java   |  44 +--
 .../tajo/storage/SerializerDeserializer.java    |   7 +-
 .../apache/tajo/storage/TableStatistics.java    |  31 +-
 .../storage/TextSerializerDeserializer.java     |  67 ++--
 .../org/apache/tajo/storage/TupleRange.java     |   2 -
 .../apache/tajo/tuple/offheap/HeapTuple.java    |  51 ++--
 .../apache/tajo/tuple/offheap/UnSafeTuple.java  |  55 ++--
 .../org/apache/tajo/storage/TestFrameTuple.java |  14 +-
 .../org/apache/tajo/storage/TestLazyTuple.java  |  26 +-
 .../tajo/storage/TestTupleComparator.java       |   7 +-
 .../org/apache/tajo/storage/TestVTuple.java     |  23 +-
 .../tajo/tuple/offheap/TestOffHeapRowBlock.java |  26 +-
 .../storage/hbase/AbstractHBaseAppender.java    |  15 +-
 .../HBaseBinarySerializerDeserializer.java      |  35 +++
 .../tajo/storage/hbase/HBasePutAppender.java    |   6 +-
 .../tajo/storage/hbase/HBaseTablespace.java     |   2 +-
 .../hbase/HBaseTextSerializerDeserializer.java  |   9 +
 .../java/org/apache/tajo/storage/CSVFile.java   |   9 +-
 .../storage/FieldSerializerDeserializer.java    |   7 +-
 .../java/org/apache/tajo/storage/RawFile.java   |   4 +-
 .../java/org/apache/tajo/storage/RowFile.java   |  28 +-
 .../apache/tajo/storage/avro/AvroAppender.java  |   5 +-
 .../tajo/storage/json/JsonLineSerializer.java   |   2 +-
 .../tajo/storage/parquet/ParquetAppender.java   |   2 +-
 .../storage/parquet/TajoRecordConverter.java    |   2 +-
 .../tajo/storage/parquet/TajoWriteSupport.java  |  26 +-
 .../org/apache/tajo/storage/rcfile/RCFile.java  |  22 +-
 .../sequencefile/SequenceFileAppender.java      |  23 +-
 .../sequencefile/SequenceFileScanner.java       |   3 +-
 .../tajo/storage/text/CSVLineDeserializer.java  |  11 +-
 .../tajo/storage/text/CSVLineSerializer.java    |   5 +-
 .../text/TextFieldSerializerDeserializer.java   |  38 ++-
 .../tajo/storage/TestDelimitedTextFile.java     |   4 +-
 .../tajo/storage/TestFileStorageManager.java    |   5 +-
 .../apache/tajo/storage/TestFileSystems.java    |   9 +-
 .../apache/tajo/storage/TestMergeScanner.java   |  20 +-
 .../org/apache/tajo/storage/TestStorages.java   |  57 ++--
 .../apache/tajo/storage/index/TestBSTIndex.java |  92 +++---
 .../index/TestSingleCSVFileBSTIndex.java        |  24 +-
 .../apache/tajo/storage/json/TestJsonSerDe.java |   3 +-
 .../tajo/storage/parquet/TestReadWrite.java     |   2 +-
 221 files changed, 2023 insertions(+), 1940 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 85c28ce..44a8939 100644
--- a/CHANGES
+++ b/CHANGES
@@ -287,6 +287,9 @@ Release 0.11.0 - unreleased
   
   TASKS
 
+    TAJO-1450: Encapsulate Datum in Tuple. (Contributed by navis, 
+    Committed by jihoon)
+
     TAJO-1583: Remove ServerCallable in RPC client. (jinho)
 
     TAJO-1587: Upgrade java version to 1.7 for Travis CI. (jihoon)

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java b/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java
index 77cbbf2..ed06cf3 100644
--- a/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java
+++ b/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java
@@ -69,8 +69,8 @@ public abstract class TajoResultSetBase implements ResultSet {
     wasNull = false;
   }
 
-  private void handleNull(Datum d) {
-    wasNull = (d instanceof NullDatum);
+  private boolean handleNull(Tuple tuple, int index) {
+    return wasNull = tuple.isBlankOrNull(index);
   }
 
   public Tuple getCurrentTuple() {
@@ -84,274 +84,211 @@ public abstract class TajoResultSetBase implements ResultSet {
 
   @Override
   public boolean getBoolean(int fieldId) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return false;
-    }
-    return datum.asBool();
+    return getBoolean(cur, fieldId - 1);
   }
 
   @Override
   public boolean getBoolean(String colName) throws SQLException {
-    Datum datum = cur.get(findColumn(colName));
-    handleNull(datum);
-    if (wasNull) {
-      return false;
-    }
-    return datum.asBool();
+    return getBoolean(cur, findColumn(colName));
+  }
+
+  private boolean getBoolean(Tuple tuple, int index) {
+    return handleNull(tuple, index) ? false : tuple.getBool(index);
   }
 
   @Override
   public byte getByte(int fieldId) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return 0;
-    }
-    return datum.asByte();
+    return getByte(cur, fieldId - 1);
   }
 
   @Override
   public byte getByte(String name) throws SQLException {
-    Datum datum = cur.get(findColumn(name));
-    handleNull(datum);
-    if (wasNull) {
-      return 0;
-    }
-    return datum.asByte();
+    return getByte(cur, findColumn(name));
+  }
+
+  private byte getByte(Tuple tuple, int index) {
+    return handleNull(tuple, index) ? 0 : tuple.getByte(index);
   }
 
   @Override
   public byte[] getBytes(int fieldId) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return null;
-    }
-    return datum.asByteArray();
+    return getBytes(cur, fieldId - 1);
   }
 
   @Override
   public byte[] getBytes(String name) throws SQLException {
-    Datum datum = cur.get(findColumn(name));
-    handleNull(datum);
-    if (wasNull) {
-      return null;
-    }
-    return datum.asByteArray();
+    return getBytes(cur, findColumn(name));
+  }
+
+  private byte[] getBytes(Tuple tuple, int index) {
+    return handleNull(tuple, index) ? null : tuple.getBytes(index);
   }
 
   @Override
   public double getDouble(int fieldId) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return 0.0d;
-    }
-    return datum.asFloat8();
+    return getDouble(cur, fieldId - 1);
   }
 
   @Override
   public double getDouble(String name) throws SQLException {
-    Datum datum = cur.get(findColumn(name));
-    handleNull(datum);
-    if (wasNull) {
-      return 0.0d;
-    }
-    return datum.asFloat8();
+    return getDouble(cur, findColumn(name));
+  }
+
+  private double getDouble(Tuple tuple, int index) {
+    return handleNull(tuple, index) ? 0.0d : tuple.getFloat8(index);
   }
 
   @Override
   public float getFloat(int fieldId) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return 0.0f;
-    }
-    return datum.asFloat4();
+    return getFloat(cur, fieldId - 1);
   }
 
   @Override
   public float getFloat(String name) throws SQLException {
-    Datum datum = cur.get(findColumn(name));
-    handleNull(datum);
-    if (wasNull) {
-      return 0.0f;
-    }
-    return datum.asFloat4();
+    return getFloat(cur, findColumn(name));
+  }
+
+  private float getFloat(Tuple tuple, int index) throws SQLException {
+    return handleNull(tuple, index) ? 0.0f : tuple.getFloat4(index);
   }
 
   @Override
   public int getInt(int fieldId) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return 0;
-    }
-    return datum.asInt4();
+    return getInt(cur, fieldId - 1);
   }
 
   @Override
   public int getInt(String name) throws SQLException {
-    Datum datum = cur.get(findColumn(name));
-    handleNull(datum);
-    if (wasNull) {
-      return 0;
-    }
-    return datum.asInt4();
+    return getInt(cur, findColumn(name));
+  }
+
+  private int getInt(Tuple tuple, int index) throws SQLException {
+    return handleNull(tuple, index) ? 0 : tuple.getInt4(index);
   }
 
   @Override
   public long getLong(int fieldId) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return 0;
-    }
-    return datum.asInt8();
+    return getLong(cur, fieldId - 1);
   }
 
   @Override
   public long getLong(String name) throws SQLException {
-    Datum datum = cur.get(findColumn(name));
-    handleNull(datum);
-    if (wasNull) {
-      return 0;
-    }
-    return datum.asInt8();
+    return getLong(cur, findColumn(name));
+  }
+
+  private long getLong(Tuple tuple, int index) throws SQLException {
+    return handleNull(tuple, index) ? 0 : tuple.getInt8(index);
   }
 
   @Override
   public Object getObject(int fieldId) throws SQLException {
-    Datum d = cur.get(fieldId - 1);
-    handleNull(d);
+    return getObject(cur, fieldId - 1);
+  }
 
-    if (wasNull) {
+  @Override
+  public Object getObject(String name) throws SQLException {
+    return getObject(cur, findColumn(name));
+  }
+
+  private Object getObject(Tuple tuple, int index) {
+    if (handleNull(tuple, index)) {
       return null;
     }
-    TajoDataTypes.Type dataType = schema.getColumn(fieldId - 1).getDataType().getType();
+
+    TajoDataTypes.Type dataType = schema.getColumn(index).getDataType().getType();
 
     switch(dataType) {
-      case BOOLEAN:  return d.asBool();
+      case BOOLEAN:  return tuple.getBool(index);
       case INT1:
-      case INT2: return d.asInt2();
-      case INT4: return d.asInt4();
-      case INT8: return d.asInt8();
+      case INT2: return tuple.getInt2(index);
+      case INT4: return tuple.getInt4(index);
+      case INT8: return tuple.getInt8(index);
       case TEXT:
       case CHAR:
-      case VARCHAR:  return d.asChars();
-      case FLOAT4:  return d.asFloat4();
-      case FLOAT8:  return d.asFloat8();
-      case NUMERIC:  return d.asFloat8();
+      case VARCHAR:  return tuple.getText(index);
+      case FLOAT4:  return tuple.getFloat4(index);
+      case FLOAT8:  return tuple.getFloat8(index);
+      case NUMERIC:  return tuple.getFloat8(index);
       case DATE: {
-        return getDate((DateDatum)d, timezone);
+        return toDate(tuple.getTimeDate(index), timezone);
       }
       case TIME: {
-        return getTime((TimeDatum)d, timezone);
+        return toTime(tuple.getTimeDate(index), timezone);
       }
       case TIMESTAMP: {
-        return getTimestamp((TimestampDatum) d, timezone);
+        return toTimestamp(tuple.getTimeDate(index), timezone);
       }
-      default: return d.asChars();
+      default:
+        return tuple.getText(index);
     }
   }
 
   @Override
-  public Object getObject(String name) throws SQLException {
-    return getObject(findColumn(name) + 1);
-  }
-
-  @Override
   public short getShort(int fieldId) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return 0;
-    }
-    return datum.asInt2();
+    return getShort(cur, fieldId - 1);
   }
 
   @Override
   public short getShort(String name) throws SQLException {
-    Datum datum = cur.get(findColumn(name));
-    handleNull(datum);
-    if (wasNull) {
-      return 0;
-    }
-    return datum.asInt2();
+    return getShort(cur, findColumn(name));
+  }
+
+  private short getShort(Tuple tuple, int index) throws SQLException {
+    return handleNull(tuple, index) ? 0 : tuple.getInt2(index);
   }
 
   @Override
   public String getString(int fieldId) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    return getString(datum, fieldId);
+    return getString(cur, fieldId - 1);
   }
 
   @Override
   public String getString(String name) throws SQLException {
-    int id = findColumn(name);
-    Datum datum = cur.get(id);
-    return getString(datum, id + 1);
+    return getString(cur, findColumn(name));
   }
 
-  private String getString(Datum datum, int fieldId) throws SQLException {
-    handleNull(datum);
-
-    if (wasNull) {
+  private String getString(Tuple tuple, int index) throws SQLException {
+    if (handleNull(tuple, index)) {
       return null;
     }
 
-    TajoDataTypes.Type dataType = datum.type();
-
-    switch(dataType) {
+    switch(tuple.type(index)) {
       case BOOLEAN:
-        return String.valueOf(datum.asBool());
-      case TIME: {
-        return ((TimeDatum)datum).asChars(timezone, false);
-      }
-      case TIMESTAMP: {
-        return ((TimestampDatum)datum).asChars(timezone, false);
-      }
+        return String.valueOf(tuple.getBool(index));
+      case TIME:
+        return TimeDatum.asChars(tuple.getTimeDate(index), timezone, false);
+      case TIMESTAMP:
+        return TimestampDatum.asChars(tuple.getTimeDate(index), timezone, false);
       default :
-        return datum.asChars();
+        return tuple.getText(index);
     }
   }
 
   @Override
   public Date getDate(int fieldId) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return null;
-    }
-
-    return getDate((DateDatum)datum, null);
+    return getDate(cur, null, fieldId - 1);
   }
 
   @Override
   public Date getDate(String name) throws SQLException {
-    return getDate(findColumn(name) + 1);
+    return getDate(cur, null, findColumn(name));
   }
 
   @Override
   public Date getDate(int fieldId, Calendar x) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return null;
-    }
-
-    return getDate((DateDatum)datum, x.getTimeZone());
+    return getDate(cur, x.getTimeZone(), fieldId - 1);
   }
 
   @Override
   public Date getDate(String name, Calendar x) throws SQLException {
-    return getDate(findColumn(name) + 1, x);
+    return getDate(cur, x.getTimeZone(), findColumn(name));
   }
 
-  private Date getDate(DateDatum datum, TimeZone tz) {
-    TimeMeta tm = datum.toTimeMeta();
+  private Date getDate(Tuple tuple, TimeZone tz, int index) throws SQLException {
+    return handleNull(tuple, index) ? null : toDate(tuple.getTimeDate(index), tz);
+  }
+
+  private Date toDate(TimeMeta tm, TimeZone tz) {
     if (tz != null) {
       DateTimeUtil.toUserTimezone(tm, tz);
     }
@@ -360,39 +297,29 @@ public abstract class TajoResultSetBase implements ResultSet {
 
   @Override
   public Time getTime(int fieldId) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return null;
-    }
-
-    return getTime((TimeDatum)datum, timezone);
-
+    return getTime(cur, null, fieldId - 1);
   }
 
   @Override
   public Time getTime(String name) throws SQLException {
-    return getTime(findColumn(name) + 1);
+    return getTime(cur, null, findColumn(name));
   }
 
   @Override
   public Time getTime(int fieldId, Calendar x) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return null;
-    }
-
-    return getTime((TimeDatum)datum, x.getTimeZone());
+    return getTime(cur, x.getTimeZone(), fieldId - 1);
   }
 
   @Override
   public Time getTime(String name, Calendar x) throws SQLException {
-    return getTime(findColumn(name) + 1, x);
+    return getTime(cur, x.getTimeZone(), findColumn(name));
   }
 
-  private Time getTime(TimeDatum datum, TimeZone tz) {
-    TimeMeta tm = datum.toTimeMeta();
+  private Time getTime(Tuple tuple, TimeZone tz, int index) throws SQLException {
+    return handleNull(tuple, index) ? null : toTime(tuple.getTimeDate(index), tz);
+  }
+
+  private Time toTime(TimeMeta tm, TimeZone tz) {
     if (tz != null) {
       DateTimeUtil.toUserTimezone(tm, tz);
     }
@@ -401,38 +328,29 @@ public abstract class TajoResultSetBase implements ResultSet {
 
   @Override
   public Timestamp getTimestamp(int fieldId) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return null;
-    }
-
-    return getTimestamp((TimestampDatum)datum, timezone);
+    return getTimestamp(cur, null, fieldId - 1);
   }
 
   @Override
   public Timestamp getTimestamp(String name) throws SQLException {
-    return getTimestamp(findColumn(name) + 1);
+    return getTimestamp(cur, null, findColumn(name));
   }
 
   @Override
   public Timestamp getTimestamp(int fieldId, Calendar x) throws SQLException {
-    Datum datum = cur.get(fieldId - 1);
-    handleNull(datum);
-    if (wasNull) {
-      return null;
-    }
-
-    return getTimestamp((TimestampDatum)datum, x.getTimeZone());
+    return getTimestamp(cur, x.getTimeZone(), fieldId - 1);
   }
 
   @Override
   public Timestamp getTimestamp(String name, Calendar x) throws SQLException {
-    return getTimestamp(findColumn(name) + 1, x);
+    return getTimestamp(cur, x.getTimeZone(), findColumn(name));
+  }
+
+  private Timestamp getTimestamp(Tuple tuple, TimeZone tz, int index) throws SQLException {
+    return handleNull(tuple, index) ? null : toTimestamp(tuple.getTimeDate(index), tz);
   }
 
-  private Timestamp getTimestamp(TimestampDatum datum, TimeZone tz) {
-    TimeMeta tm = datum.toTimeMeta();
+  private Timestamp toTimestamp(TimeMeta tm, TimeZone tz) {
     if (tz != null) {
       DateTimeUtil.toUserTimezone(tm, tz);
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-client/src/main/java/org/apache/tajo/storage/RowStoreUtil.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/storage/RowStoreUtil.java b/tajo-client/src/main/java/org/apache/tajo/storage/RowStoreUtil.java
index 95dd60e..ba7cf48 100644
--- a/tajo-client/src/main/java/org/apache/tajo/storage/RowStoreUtil.java
+++ b/tajo-client/src/main/java/org/apache/tajo/storage/RowStoreUtil.java
@@ -45,14 +45,6 @@ public class RowStoreUtil {
     return targetIds;
   }
 
-  public static Tuple project(Tuple in, Tuple out, int[] targetIds) {
-    out.clear();
-    for (int idx = 0; idx < targetIds.length; idx++) {
-      out.put(idx, in.get(targetIds[idx]));
-    }
-    return out;
-  }
-
   public static RowStoreEncoder createEncoder(Schema schema) {
     return new RowStoreEncoder(schema);
   }
@@ -77,7 +69,7 @@ public class RowStoreUtil {
     public Tuple toTuple(byte [] bytes) {
       nullFlags.clear();
       ByteBuffer bb = ByteBuffer.wrap(bytes);
-      Tuple tuple = new VTuple(schema.size());
+      VTuple tuple = new VTuple(schema.size());
       Column col;
       TajoDataTypes.DataType type;
 
@@ -189,7 +181,7 @@ public class RowStoreUtil {
       bb.position(headerSize);
       Column col;
       for (int i = 0; i < schema.size(); i++) {
-        if (tuple.isNull(i)) {
+        if (tuple.isBlankOrNull(i)) {
           nullFlags.set(i);
           continue;
         }
@@ -197,12 +189,17 @@ public class RowStoreUtil {
         col = schema.getColumn(i);
         switch (col.getDataType().getType()) {
           case NULL_TYPE: nullFlags.set(i); break;
-          case BOOLEAN: bb.put(tuple.get(i).asByte()); break;
-          case BIT: bb.put(tuple.get(i).asByte()); break;
+          case BOOLEAN: bb.put(tuple.getByte(i)); break;
+          case BIT: bb.put(tuple.getByte(i)); break;
+          case INT2: bb.putShort(tuple.getInt2(i)); break;
+          case INT4: bb.putInt(tuple.getInt4(i)); break;
+          case INT8: bb.putLong(tuple.getInt8(i)); break;
+          case FLOAT4: bb.putFloat(tuple.getFloat4(i)); break;
+          case FLOAT8: bb.putDouble(tuple.getFloat8(i)); break;
           case CHAR:
             int charSize = col.getDataType().getLength();
             byte [] _char = new byte[charSize];
-            byte [] src = tuple.get(i).asByteArray();
+            byte [] src = tuple.getBytes(i);
             if (charSize < src.length) {
               throw new ValueTooLongForTypeCharactersException(charSize);
             }
@@ -210,36 +207,31 @@ public class RowStoreUtil {
             System.arraycopy(src, 0, _char, 0, src.length);
             bb.put(_char);
             break;
-          case INT2: bb.putShort(tuple.get(i).asInt2()); break;
-          case INT4: bb.putInt(tuple.get(i).asInt4()); break;
-          case INT8: bb.putLong(tuple.get(i).asInt8()); break;
-          case FLOAT4: bb.putFloat(tuple.get(i).asFloat4()); break;
-          case FLOAT8: bb.putDouble(tuple.get(i).asFloat8()); break;
           case TEXT:
-            byte [] _string = tuple.get(i).asByteArray();
+            byte [] _string = tuple.getBytes(i);
             bb.putInt(_string.length);
             bb.put(_string);
             break;
-          case DATE: bb.putInt(tuple.get(i).asInt4()); break;
+          case DATE: bb.putInt(tuple.getInt4(i)); break;
           case TIME:
           case TIMESTAMP:
-            bb.putLong(tuple.get(i).asInt8());
+            bb.putLong(tuple.getInt8(i));
             break;
           case INTERVAL:
-            IntervalDatum interval = (IntervalDatum) tuple.get(i);
+            IntervalDatum interval = (IntervalDatum) tuple.getInterval(i);
             bb.putInt(interval.getMonths());
             bb.putLong(interval.getMilliSeconds());
             break;
           case BLOB:
-            byte [] bytes = tuple.get(i).asByteArray();
+            byte [] bytes = tuple.getBytes(i);
             bb.putInt(bytes.length);
             bb.put(bytes);
             break;
           case INET4:
-            byte [] ipBytes = tuple.get(i).asByteArray();
+            byte [] ipBytes = tuple.getBytes(i);
             bb.put(ipBytes);
             break;
-          case INET6: bb.put(tuple.get(i).asByteArray()); break;
+          case INET6: bb.put(tuple.getBytes(i)); break;
           default:
             throw new RuntimeException(new UnknownDataTypeException(col.getDataType().getType().name()));
         }
@@ -263,7 +255,7 @@ public class RowStoreUtil {
       Column col;
 
       for (int i = 0; i < schema.size(); i++) {
-        if (tuple.isNull(i)) {
+        if (tuple.isBlankOrNull(i)) {
           continue;
         }
 
@@ -286,9 +278,9 @@ public class RowStoreUtil {
           case FLOAT8: size += 8; break;
           case INTERVAL: size += 12; break;
           case TEXT:
-          case BLOB: size += (4 + tuple.get(i).asByteArray().length); break;
+          case BLOB: size += (4 + tuple.getBytes(i).length); break;
           case INET4:
-          case INET6: size += tuple.get(i).asByteArray().length; break;
+          case INET6: size += tuple.getBytes(i).length; break;
           default:
             throw new RuntimeException(new UnknownDataTypeException(col.getDataType().getType().name()));
         }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
index 65342e8..093a8be 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
@@ -47,7 +47,7 @@ public class DateDatum extends Datum {
     dayOfMonth = tm.dayOfMonth;
   }
 
-  public TimeMeta toTimeMeta() {
+  public TimeMeta asTimeMeta() {
     TimeMeta tm = new TimeMeta();
     tm.years = year;
     tm.monthOfYear = monthOfYear;
@@ -56,7 +56,7 @@ public class DateDatum extends Datum {
   }
 
   public int getCenturyOfEra() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.getCenturyOfEra();
   }
 
@@ -65,7 +65,7 @@ public class DateDatum extends Datum {
   }
 
   public int getWeekyear() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.getWeekyear();
   }
 
@@ -74,22 +74,22 @@ public class DateDatum extends Datum {
   }
 
   public int getDayOfYear() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.getDayOfYear();
   }
 
   public int getDayOfWeek() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.getDayOfWeek();
   }
 
   public int getISODayOfWeek() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.getISODayOfWeek();
   }
 
   public int getWeekOfYear() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.getWeekOfYear();
   }
 
@@ -110,18 +110,18 @@ public class DateDatum extends Datum {
       case INT8:
       case FLOAT4:
       case FLOAT8: {
-        TimeMeta tm = toTimeMeta();
+        TimeMeta tm = asTimeMeta();
         tm.plusDays(datum.asInt4());
         return new DateDatum(tm);
       }
       case INTERVAL:
         IntervalDatum interval = (IntervalDatum) datum;
-        TimeMeta tm = toTimeMeta();
+        TimeMeta tm = asTimeMeta();
         tm.plusInterval(interval.months, interval.milliseconds);
         return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
       case TIME: {
-        TimeMeta tm1 = toTimeMeta();
-        TimeMeta tm2 = ((TimeDatum)datum).toTimeMeta();
+        TimeMeta tm1 = asTimeMeta();
+        TimeMeta tm2 = datum.asTimeMeta();
         tm1.plusTime(DateTimeUtil.toTime(tm2));
         return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
       }
@@ -138,19 +138,19 @@ public class DateDatum extends Datum {
       case INT8:
       case FLOAT4:
       case FLOAT8: {
-        TimeMeta tm = toTimeMeta();
+        TimeMeta tm = asTimeMeta();
         tm.plusDays(0 - datum.asInt4());
         return new DateDatum(tm);
       }
       case INTERVAL: {
         IntervalDatum interval = (IntervalDatum) datum;
-        TimeMeta tm = toTimeMeta();
+        TimeMeta tm = asTimeMeta();
         tm.plusInterval(-interval.months, -interval.milliseconds);
         return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
       }
       case TIME: {
-        TimeMeta tm1 = toTimeMeta();
-        TimeMeta tm2 = ((TimeDatum)datum).toTimeMeta();
+        TimeMeta tm1 = asTimeMeta();
+        TimeMeta tm2 = datum.asTimeMeta();
         tm1.plusTime(0 - DateTimeUtil.toTime(tm2));
         return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
       }
@@ -231,8 +231,8 @@ public class DateDatum extends Datum {
     } else if (datum.type() == TajoDataTypes.Type.TIMESTAMP) {
       TimestampDatum another = (TimestampDatum) datum;
       TimeMeta myMeta, otherMeta;
-      myMeta = toTimeMeta();
-      otherMeta = another.toTimeMeta();
+      myMeta = asTimeMeta();
+      otherMeta = another.asTimeMeta();
       return myMeta.compareTo(otherMeta);
     } else if (datum instanceof NullDatum || datum.isNull()) {
       return -1;

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java
index 1ff305d..e3e1295 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Datum.java
@@ -26,6 +26,7 @@ import org.apache.tajo.exception.InvalidCastException;
 import org.apache.tajo.exception.InvalidOperationException;
 import org.apache.tajo.json.CommonGsonHelper;
 import org.apache.tajo.json.GsonObject;
+import org.apache.tajo.util.datetime.TimeMeta;
 
 import static org.apache.tajo.common.TajoDataTypes.Type;
 
@@ -102,6 +103,7 @@ public abstract class Datum implements Comparable<Datum>, GsonObject {
     throw new InvalidCastException(type, Type.TEXT);
   }
 
+  // todo remove this
   public char [] asUnicodeChars() {
     throw new InvalidCastException(type, Type.TEXT);
   }
@@ -110,6 +112,10 @@ public abstract class Datum implements Comparable<Datum>, GsonObject {
     return asChars().getBytes();
   }
 
+  public TimeMeta asTimeMeta() {
+    throw new InvalidCastException(type, Type.INT8);
+  }
+
   public boolean isNumeric() {
     return isNumber() || isReal();
   }
@@ -133,6 +139,7 @@ public abstract class Datum implements Comparable<Datum>, GsonObject {
 
   public abstract int size();
 
+  // belows should be extracted out of datum
   public Datum and(Datum datum) {
     throw new InvalidOperationException(datum.type);
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
index bd1b88f..480582a 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
@@ -433,7 +433,7 @@ public class DatumFactory {
         case TIMESTAMP: {
           TimestampDatum timestampDatum = (TimestampDatum)operandDatum;
           if (tz != null) {
-            return DatumFactory.createText(timestampDatum.asChars(tz, false));
+            return DatumFactory.createText(TimestampDatum.asChars(operandDatum.asTimeMeta(), tz, false));
           } else {
             return DatumFactory.createText(timestampDatum.asChars());
           }
@@ -441,7 +441,7 @@ public class DatumFactory {
         case TIME: {
           TimeDatum timeDatum = (TimeDatum)operandDatum;
           if (tz != null) {
-            return DatumFactory.createText(timeDatum.asChars(tz, false));
+            return DatumFactory.createText(TimeDatum.asChars(operandDatum.asTimeMeta(), tz, false));
           } else {
             return DatumFactory.createText(timeDatum.asChars());
           }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
index e71a201..0fe598a 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
@@ -214,8 +214,7 @@ public class Float4Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
     case DATE:
-      DateDatum dateDatum = (DateDatum)datum;
-      TimeMeta tm = dateDatum.toTimeMeta();
+      TimeMeta tm = datum.asTimeMeta();
       tm.plusDays(asInt4());
       return new DateDatum(tm);
     case NULL_TYPE:
@@ -239,8 +238,7 @@ public class Float4Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
     case DATE:
-      DateDatum dateDatum = (DateDatum)datum;
-      TimeMeta tm = dateDatum.toTimeMeta();
+      TimeMeta tm = datum.asTimeMeta();
       tm.plusDays(0 - asInt4());
       return new DateDatum(tm);
     case NULL_TYPE:

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
index a0298f2..6ebe10b 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
@@ -203,8 +203,7 @@ public class Float8Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
     case DATE:
-      DateDatum dateDatum = (DateDatum)datum;
-      TimeMeta tm = dateDatum.toTimeMeta();
+      TimeMeta tm = datum.asTimeMeta();
       tm.plusDays(asInt4());
       return new DateDatum(tm);
     case NULL_TYPE:
@@ -228,8 +227,7 @@ public class Float8Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
     case DATE:
-      DateDatum dateDatum = (DateDatum)datum;
-      TimeMeta tm = dateDatum.toTimeMeta();
+      TimeMeta tm = datum.asTimeMeta();
       tm.plusDays(0 - asInt4());
       return new DateDatum(tm);
     case NULL_TYPE:

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
index f11a5c5..6145c75 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
@@ -205,8 +205,7 @@ public class Int2Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
     case DATE:
-      DateDatum dateDatum = (DateDatum)datum;
-      TimeMeta tm = dateDatum.toTimeMeta();
+      TimeMeta tm = datum.asTimeMeta();
       tm.plusDays(asInt2());
       return new DateDatum(tm);
     case NULL_TYPE:
@@ -230,8 +229,7 @@ public class Int2Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
     case DATE:
-      DateDatum dateDatum = (DateDatum)datum;
-      TimeMeta tm = dateDatum.toTimeMeta();
+      TimeMeta tm = datum.asTimeMeta();
       tm.plusDays(0 - asInt2());
       return new DateDatum(tm);
     case NULL_TYPE:

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
index ea531b9..530ef84 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
@@ -209,8 +209,7 @@ public class Int4Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
     case DATE:
-      DateDatum dateDatum = (DateDatum)datum;
-      TimeMeta tm = dateDatum.toTimeMeta();
+      TimeMeta tm = datum.asTimeMeta();
       tm.plusDays(asInt4());
       return new DateDatum(tm);
     case NULL_TYPE:
@@ -234,8 +233,7 @@ public class Int4Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
     case DATE:
-      DateDatum dateDatum = (DateDatum)datum;
-      TimeMeta tm = dateDatum.toTimeMeta();
+      TimeMeta tm = datum.asTimeMeta();
       tm.plusDays(0 - asInt4());
       return new DateDatum(tm);
     case NULL_TYPE:

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
index cd448e3..66c093a 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
@@ -217,8 +217,7 @@ public class Int8Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
     case DATE:
-      DateDatum dateDatum = (DateDatum)datum;
-      TimeMeta tm = dateDatum.toTimeMeta();
+      TimeMeta tm = datum.asTimeMeta();
       tm.plusDays(asInt4());
       return new DateDatum(tm);
     case NULL_TYPE:
@@ -242,8 +241,7 @@ public class Int8Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
     case DATE:
-      DateDatum dateDatum = (DateDatum)datum;
-      TimeMeta tm = dateDatum.toTimeMeta();
+      TimeMeta tm = datum.asTimeMeta();
       tm.plusDays(0 - asInt4());
       return new DateDatum(tm);
     case NULL_TYPE:

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java
index e8d439d..d3cb6c7 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java
@@ -231,12 +231,12 @@ public class IntervalDatum extends Datum {
         return new IntervalDatum(months + other.months, milliseconds + other.milliseconds);
       case DATE: {
         DateDatum dateDatum = (DateDatum) datum;
-        TimeMeta tm = dateDatum.toTimeMeta();
+        TimeMeta tm = dateDatum.asTimeMeta();
         tm.plusInterval(months, milliseconds);
         return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
       }
       case TIME: {
-        TimeMeta tm = ((TimeDatum) datum).toTimeMeta();
+        TimeMeta tm = datum.asTimeMeta();
         tm.plusInterval(months, milliseconds);
         return new TimeDatum(DateTimeUtil.toTime(tm));
       }
@@ -303,7 +303,7 @@ public class IntervalDatum extends Datum {
 
   private IntervalDatum createIntervalDatum(double monthValue, double millisValue) {
     int month = (int)(monthValue);
-    return new IntervalDatum(month, Math.round((monthValue - (double)month) * (double)MONTH_MILLIS + (double)millisValue));
+    return new IntervalDatum(month, Math.round((monthValue - (double)month) * (double)MONTH_MILLIS + millisValue));
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
index 04cce54..5786657 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
@@ -38,7 +38,8 @@ public class TimeDatum extends Datum {
     this.time = time;
   }
 
-  public TimeMeta toTimeMeta() {
+  @Override
+  public TimeMeta asTimeMeta() {
     TimeMeta tm = new TimeMeta();
     DateTimeUtil.date2j(time, tm);
 
@@ -46,12 +47,12 @@ public class TimeDatum extends Datum {
   }
 
   public int getHourOfDay() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.hours;
   }
 
   public int getMinuteOfHour() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.minutes;
   }
 
@@ -62,7 +63,7 @@ public class TimeDatum extends Datum {
   }
 
   public int getMillisOfSecond() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.fsecs / 1000;
   }
 
@@ -92,12 +93,11 @@ public class TimeDatum extends Datum {
 
   @Override
   public String asChars() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return DateTimeUtil.encodeTime(tm, DateStyle.ISO_DATES);
   }
 
-  public String asChars(TimeZone timeZone, boolean includeTimeZone) {
-    TimeMeta tm = toTimeMeta();
+  public static String asChars(TimeMeta tm, TimeZone timeZone, boolean includeTimeZone) {
     DateTimeUtil.toUserTimezone(tm, timeZone);
     if (includeTimeZone) {
       tm.timeZone = timeZone.getRawOffset() / 1000;
@@ -106,7 +106,7 @@ public class TimeDatum extends Datum {
   }
 
   public String toString(TimeZone timeZone, boolean includeTimeZone) {
-    return asChars(timeZone, includeTimeZone);
+    return asChars(asTimeMeta(), timeZone, includeTimeZone);
   }
 
   @Override
@@ -124,12 +124,12 @@ public class TimeDatum extends Datum {
     switch(datum.type()) {
       case INTERVAL:
         IntervalDatum interval = ((IntervalDatum)datum);
-        TimeMeta tm = toTimeMeta();
+        TimeMeta tm = asTimeMeta();
         tm.plusInterval(interval.months, interval.milliseconds);
         return new TimeDatum(DateTimeUtil.toTime(tm));
       case DATE: {
         DateDatum dateDatum = (DateDatum) datum;
-        TimeMeta dateTm = dateDatum.toTimeMeta();
+        TimeMeta dateTm = dateDatum.asTimeMeta();
         dateTm.plusTime(time);
         return new TimestampDatum(DateTimeUtil.toJulianTimestamp(dateTm));
       }
@@ -143,7 +143,7 @@ public class TimeDatum extends Datum {
     switch(datum.type()) {
       case INTERVAL:
         IntervalDatum interval = ((IntervalDatum)datum);
-        TimeMeta tm = toTimeMeta();
+        TimeMeta tm = asTimeMeta();
         tm.plusInterval(-interval.months, -interval.milliseconds);
         return new TimeDatum(DateTimeUtil.toTime(tm));
       case TIME:

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
index ad73c74..02425eb 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
@@ -61,57 +61,57 @@ public class TimestampDatum extends Datum {
 
 
   public int getCenturyOfEra() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.getCenturyOfEra();
   }
 
   public int getYear() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.years;
   }
 
   public int getMonthOfYear() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.monthOfYear;
   }
 
   public int getDayOfYear() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.getDayOfYear();
   }
 
   public int getDayOfWeek() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.getDayOfYear();
   }
 
   public int getWeekOfYear() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.getWeekOfYear();
   }
 
   public int getDayOfMonth() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.dayOfMonth;
   }
 
   public int getHourOfDay() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.hours;
   }
 
   public int getMinuteOfHour() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.minutes;
   }
 
   public int getSecondOfMinute() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.secs;
   }
 
   public int getMillisOfSecond() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return tm.fsecs / 1000;
   }
 
@@ -123,17 +123,16 @@ public class TimestampDatum extends Datum {
     return asChars();
   }
 
-  public String asChars(TimeZone timeZone, boolean includeTimeZone) {
-    TimeMeta tm = toTimeMeta();
+  public static String asChars(TimeMeta tm, TimeZone timeZone, boolean includeTimeZone) {
     DateTimeUtil.toUserTimezone(tm, timeZone);
     if (includeTimeZone) {
       tm.timeZone = timeZone.getRawOffset() / 1000;
     }
-    return  DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES);
+    return DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES);
   }
 
   public String toString(TimeZone timeZone, boolean includeTimeZone) {
-    return asChars(timeZone, includeTimeZone);
+    return asChars(asTimeMeta(), timeZone, includeTimeZone);
   }
 
   @Override
@@ -143,12 +142,12 @@ public class TimestampDatum extends Datum {
 
   @Override
   public String asChars() {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
     return DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES);
   }
 
   public String toChars(String format) {
-    TimeMeta tm = toTimeMeta();
+    TimeMeta tm = asTimeMeta();
 
     return DateTimeFormat.to_char(tm, format);
   }
@@ -180,10 +179,9 @@ public class TimestampDatum extends Datum {
       TimestampDatum another = (TimestampDatum) datum;
       return Longs.compare(timestamp, another.timestamp);
     } else if (datum.type() == TajoDataTypes.Type.DATE) {
-      DateDatum another = (DateDatum) datum;
       TimeMeta myMeta, otherMeta;
-      myMeta = toTimeMeta();
-      otherMeta = another.toTimeMeta();
+      myMeta = asTimeMeta();
+      otherMeta = datum.asTimeMeta();
       return myMeta.compareTo(otherMeta);
     } else if (datum.isNull()) {
       return -1;
@@ -206,7 +204,7 @@ public class TimestampDatum extends Datum {
   public Datum plus(Datum datum) {
     if (datum.type() == TajoDataTypes.Type.INTERVAL) {
       IntervalDatum interval = (IntervalDatum)datum;
-      TimeMeta tm = toTimeMeta();
+      TimeMeta tm = asTimeMeta();
       tm.plusInterval(interval.months, interval.milliseconds);
       return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
     } else {
@@ -219,7 +217,7 @@ public class TimestampDatum extends Datum {
     switch(datum.type()) {
       case INTERVAL:
         IntervalDatum interval = (IntervalDatum)datum;
-        TimeMeta tm = toTimeMeta();
+        TimeMeta tm = asTimeMeta();
         tm.plusInterval(-interval.months, -interval.milliseconds);
         return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
       case TIMESTAMP:
@@ -234,7 +232,8 @@ public class TimestampDatum extends Datum {
     return Longs.hashCode(timestamp);
   }
 
-  public TimeMeta toTimeMeta() {
+  @Override
+  public TimeMeta asTimeMeta() {
     TimeMeta tm = new TimeMeta();
     DateTimeUtil.toJulianTimeMeta(timestamp, tm);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/storage/EmptyTuple.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/storage/EmptyTuple.java b/tajo-common/src/main/java/org/apache/tajo/storage/EmptyTuple.java
index cdcebd7..d3ad4f3 100644
--- a/tajo-common/src/main/java/org/apache/tajo/storage/EmptyTuple.java
+++ b/tajo-common/src/main/java/org/apache/tajo/storage/EmptyTuple.java
@@ -18,12 +18,19 @@
 
 package org.apache.tajo.storage;
 
+import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.datum.Datum;
+import org.apache.tajo.datum.NullDatum;
+import org.apache.tajo.datum.ProtobufDatum;
+import org.apache.tajo.util.datetime.TimeMeta;
+
 /* This class doesn’t have content datum. if selected column is zero, this is useful
 *  e.g. select count(*) from table
 * */
 public class EmptyTuple extends NullTuple {
 
   private static EmptyTuple tuple;
+  private static Datum[] EMPTY_VALUES = new Datum[0];
 
   static {
     tuple = new EmptyTuple();
@@ -38,7 +45,139 @@ public class EmptyTuple extends NullTuple {
   }
 
   @Override
-  public Tuple clone() {
+  public int size() {
+    return 0;
+  }
+
+  public boolean contains(int fieldId) {
+    return false;
+  }
+
+  @Override
+  public boolean isBlank(int fieldid) {
+    return true;
+  }
+
+  @Override
+  public boolean isBlankOrNull(int fieldid) {
+    return true;
+  }
+
+  @Override
+  public void clear() {
+  }
+
+  @Override
+  public void put(int fieldId, Datum value) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public Datum asDatum(int fieldId) {
+    return NullDatum.get();
+  }
+
+  @Override
+  public TajoDataTypes.Type type(int fieldId) {
+    return null;
+  }
+
+  @Override
+  public int size(int fieldId) {
+    return 0;
+  }
+
+  @Override
+  public void setOffset(long offset) {
+  }
+
+  @Override
+  public long getOffset() {
+    return -1;
+  }
+
+  @Override
+  public boolean getBool(int fieldId) {
+    return NullDatum.get().asBool();
+  }
+
+  @Override
+  public byte getByte(int fieldId) {
+    return NullDatum.get().asByte();
+  }
+
+  @Override
+  public char getChar(int fieldId) {
+    return NullDatum.get().asChar();
+  }
+
+  @Override
+  public byte[] getBytes(int fieldId) {
+    return NullDatum.get().asByteArray();
+  }
+
+  @Override
+  public byte[] getTextBytes(int fieldId) {
+    return NullDatum.get().asTextBytes();
+  }
+
+  @Override
+  public short getInt2(int fieldId) {
+    return NullDatum.get().asInt2();
+  }
+
+  @Override
+  public int getInt4(int fieldId) {
+    return NullDatum.get().asInt4();
+  }
+
+  @Override
+  public long getInt8(int fieldId) {
+    return NullDatum.get().asInt8();
+  }
+
+  @Override
+  public float getFloat4(int fieldId) {
+    return NullDatum.get().asFloat4();
+  }
+
+  @Override
+  public double getFloat8(int fieldId) {
+    return NullDatum.get().asFloat8();
+  }
+
+  @Override
+  public String getText(int fieldId) {
+    return NullDatum.get().asChars();
+  }
+
+  @Override
+  public TimeMeta getTimeDate(int fieldId) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public ProtobufDatum getProtobufDatum(int fieldId) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public Datum getInterval(int fieldId) {
+    return NullDatum.get();
+  }
+
+  @Override
+  public char[] getUnicodeChars(int fieldId) {
+    return NullDatum.get().asUnicodeChars();
+  }
+
+  @Override
+  public Datum[] getValues() {
+    return EMPTY_VALUES;
+  }
+
+  @Override
+  public Tuple clone() throws CloneNotSupportedException {
     return this;
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/storage/NullTuple.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/storage/NullTuple.java b/tajo-common/src/main/java/org/apache/tajo/storage/NullTuple.java
index 45eb859..a17ef01 100644
--- a/tajo-common/src/main/java/org/apache/tajo/storage/NullTuple.java
+++ b/tajo-common/src/main/java/org/apache/tajo/storage/NullTuple.java
@@ -18,9 +18,11 @@
 
 package org.apache.tajo.storage;
 
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.datum.ProtobufDatum;
+import org.apache.tajo.util.datetime.TimeMeta;
 
 import java.util.Arrays;
 
@@ -33,6 +35,8 @@ public class NullTuple implements Tuple, Cloneable {
     return new NullTuple(size);
   }
 
+  private static final byte[] NULL_TEXT_BYTES = new byte[0];
+
   private final int size;
 
   NullTuple(int size) {
@@ -49,13 +53,13 @@ public class NullTuple implements Tuple, Cloneable {
   }
 
   @Override
-  public boolean isNull(int fieldid) {
-    return true;
+  public boolean isBlank(int fieldid) {
+    return false;
   }
 
   @Override
-  public boolean isNotNull(int fieldid) {
-    return false;
+  public boolean isBlankOrNull(int fieldid) {
+    return true;
   }
 
   @Override
@@ -68,23 +72,28 @@ public class NullTuple implements Tuple, Cloneable {
   }
 
   @Override
-  public void put(int fieldId, Datum[] values) {
-    throw new UnsupportedOperationException();
+  public Datum asDatum(int fieldId) {
+    return NullDatum.get();
   }
 
   @Override
-  public void put(int fieldId, Tuple tuple) {
-    throw new UnsupportedOperationException();
+  public TajoDataTypes.Type type(int fieldId) {
+    return null;
   }
 
   @Override
-  public void put(Datum[] values) {
+  public int size(int fieldId) {
+    return 0;
+  }
+
+  @Override
+  public void put(int fieldId, Tuple tuple) {
     throw new UnsupportedOperationException();
   }
 
   @Override
-  public Datum get(int fieldId) {
-    return NullDatum.get();
+  public void put(Datum[] values) {
+    throw new UnsupportedOperationException();
   }
 
   @Override
@@ -117,6 +126,11 @@ public class NullTuple implements Tuple, Cloneable {
   }
 
   @Override
+  public byte[] getTextBytes(int fieldId) {
+    return NULL_TEXT_BYTES;
+  }
+
+  @Override
   public short getInt2(int fieldId) {
     return NullDatum.get().asInt2();
   }
@@ -147,6 +161,11 @@ public class NullTuple implements Tuple, Cloneable {
   }
 
   @Override
+  public TimeMeta getTimeDate(int fieldId) {
+    return null;
+  }
+
+  @Override
   public ProtobufDatum getProtobufDatum(int fieldId) {
     throw new UnsupportedOperationException();
   }
@@ -163,7 +182,7 @@ public class NullTuple implements Tuple, Cloneable {
 
   @Override
   public Tuple clone() throws CloneNotSupportedException {
-    return new NullTuple(size);
+    return this;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/storage/Tuple.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/storage/Tuple.java b/tajo-common/src/main/java/org/apache/tajo/storage/Tuple.java
index fce10a3..7eb56bd 100644
--- a/tajo-common/src/main/java/org/apache/tajo/storage/Tuple.java
+++ b/tajo-common/src/main/java/org/apache/tajo/storage/Tuple.java
@@ -18,62 +18,71 @@
 
 package org.apache.tajo.storage;
 
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
+import org.apache.tajo.util.datetime.TimeMeta;
 
 public interface Tuple extends Cloneable {
-  
-	int size();
-	
-	boolean contains(int fieldid);
 
-  boolean isNull(int fieldid);
+  int size();
 
-  @SuppressWarnings("unused")
-  boolean isNotNull(int fieldid);
-	
-	void clear();
-	
-	void put(int fieldId, Datum value);
+  boolean contains(int fieldid);
 
-  void put(int fieldId, Datum[] values);
+  boolean isBlank(int fieldid);
+
+  boolean isBlankOrNull(int fieldid);
 
   void put(int fieldId, Tuple tuple);
-	
-	void put(Datum[] values);
-	
 
-	Datum get(int fieldId);
-	void setOffset(long offset);
-	
-	long getOffset();
+  void put(int fieldId, Datum value);
+
+  void put(Datum[] values);
+
+  void clear();
+
+  Datum asDatum(int fieldId);
+
+  TajoDataTypes.Type type(int fieldId);
 
-	boolean getBool(int fieldId);
+  int size(int fieldId);
 
-	byte getByte(int fieldId);
+  void setOffset(long offset);
+
+  long getOffset();
+
+  boolean getBool(int fieldId);
+
+  byte getByte(int fieldId);
 
   char getChar(int fieldId);
-	
-	byte [] getBytes(int fieldId);
-	
-	short getInt2(int fieldId);
-	
-	int getInt4(int fieldId);
-	
-	long getInt8(int fieldId);
-	
-	float getFloat4(int fieldId);
-	
-	double getFloat8(int fieldId);
-	
-	String getText(int fieldId);
+
+  byte[] getBytes(int fieldId);
+
+  byte[] getTextBytes(int fieldId);
+
+  short getInt2(int fieldId);
+
+  int getInt4(int fieldId);
+
+  long getInt8(int fieldId);
+
+  float getFloat4(int fieldId);
+
+  double getFloat8(int fieldId);
+
+  String getText(int fieldId);
+
+  TimeMeta getTimeDate(int fieldId);
 
   Datum getProtobufDatum(int fieldId);
 
   Datum getInterval(int fieldId);
 
+  // todo remove this
   char [] getUnicodeChars(int fieldId);
 
   Tuple clone() throws CloneNotSupportedException;
 
+  // todo remove this
   Datum[] getValues();
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/storage/VTuple.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/storage/VTuple.java b/tajo-common/src/main/java/org/apache/tajo/storage/VTuple.java
index da69eb0..2c81e54 100644
--- a/tajo-common/src/main/java/org/apache/tajo/storage/VTuple.java
+++ b/tajo-common/src/main/java/org/apache/tajo/storage/VTuple.java
@@ -19,22 +19,24 @@
 package org.apache.tajo.storage;
 
 import com.google.gson.annotations.Expose;
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.Inet4Datum;
 import org.apache.tajo.datum.IntervalDatum;
 import org.apache.tajo.datum.ProtobufDatum;
 import org.apache.tajo.exception.UnimplementedException;
+import org.apache.tajo.util.datetime.TimeMeta;
 
 import java.net.InetAddress;
 import java.util.Arrays;
 
 public class VTuple implements Tuple, Cloneable {
-	@Expose public Datum [] values;
-	@Expose private long offset;
-	
-	public VTuple(int size) {
-		values = new Datum[size];
-	}
+  @Expose public Datum [] values;
+  @Expose private long offset;
+
+  public VTuple(int size) {
+    values = new Datum[size];
+  }
 
   public VTuple(Tuple tuple) {
     this.values = tuple.getValues().clone();
@@ -42,84 +44,90 @@ public class VTuple implements Tuple, Cloneable {
 
   public VTuple(Datum[] datum) {
     this(datum.length);
-    put(datum);
+    this.values = Arrays.copyOf(datum, datum.length);
   }
 
-	@Override
-	public int size() {	
-		return values.length;
-	}
-	
-	public boolean contains(int fieldId) {
-		return values[fieldId] != null;
-	}
+  @Override
+  public int size() {
+    return values.length;
+  }
+
+  public boolean contains(int fieldId) {
+    return values[fieldId] != null;
+  }
 
   @Override
-  public boolean isNull(int fieldid) {
+  public boolean isBlank(int fieldid) {
+    return values[fieldid] == null;
+  }
+
+  @Override
+  public boolean isBlankOrNull(int fieldid) {
     return values[fieldid] == null || values[fieldid].isNull();
   }
 
   @Override
-  public boolean isNotNull(int fieldid) {
-    return !isNull(fieldid);
+  public void put(int fieldId, Tuple tuple) {
+    this.put(fieldId, tuple.asDatum(fieldId));
   }
 
   @Override
-  public void clear() {   
+  public void clear() {
     for (int i=0; i < values.length; i++) {
       values[i] = null;
     }
   }
-	
-	//////////////////////////////////////////////////////
-	// Setter
-	//////////////////////////////////////////////////////	
-	public void put(int fieldId, Datum value) {
-		values[fieldId] = value;
-	}
+
+  //////////////////////////////////////////////////////
+  // Setter
+  //////////////////////////////////////////////////////
+  public void put(int fieldId, Datum value) {
+    values[fieldId] = value;
+  }
 
   @Override
-  public void put(int fieldId, Datum[] values) {
-    for (int i = fieldId, j = 0; j < values.length; i++, j++) {
-      values[i] = values[j];
-    }
+  public Datum asDatum(int fieldId) {
+    return values[fieldId] == null ? null : values[fieldId];
   }
 
   @Override
-  public void put(int fieldId, Tuple tuple) {
-    for (int i = fieldId, j = 0; j < tuple.size(); i++, j++) {
-      values[i] = tuple.get(j);
-    }
+  public TajoDataTypes.Type type(int fieldId) {
+    return values[fieldId].type();
+  }
+
+  @Override
+  public int size(int fieldId) {
+    return values[fieldId].size();
   }
 
   public void put(Datum [] values) {
     System.arraycopy(values, 0, this.values, 0, values.length);
-	}
-	
-	//////////////////////////////////////////////////////
-	// Getter
-	//////////////////////////////////////////////////////
-	public Datum get(int fieldId) {
-		return this.values[fieldId];
-	}
-	
-	public void setOffset(long offset) {
-	  this.offset = offset;
-	}
-	
-	public long getOffset() {
-	  return this.offset;
-	}
-	
-	@Override
-	public boolean getBool(int fieldId) {
-		return values[fieldId].asBool();
-	}
-
-  @Override
-	public byte getByte(int fieldId) {
-		return values[fieldId].asByte();
-	}
+  }
+
+  //////////////////////////////////////////////////////
+  // Getter
+  //////////////////////////////////////////////////////
+  public Datum get(int fieldId) {
+    return this.values[fieldId];
+  }
+
+  public void setOffset(long offset) {
+    this.offset = offset;
+  }
+
+  public long getOffset() {
+    return this.offset;
+  }
+
+  @Override
+  public boolean getBool(int fieldId) {
+    return values[fieldId].asBool();
+  }
+
+  @Override
+  public byte getByte(int fieldId) {
+    return values[fieldId].asByte();
+  }
 
   @Override
   public char getChar(int fieldId) {
@@ -127,55 +135,65 @@ public class VTuple implements Tuple, Cloneable {
   }
 
   @Override
-	public byte [] getBytes(int fieldId) {
-		return values[fieldId].asByteArray();
-	}
+  public byte [] getBytes(int fieldId) {
+    return values[fieldId].asByteArray();
+  }
 
   @Override
-	public short getInt2(int fieldId) {
-		return values[fieldId].asInt2();
-	}
+  public byte[] getTextBytes(int fieldId) {
+    return values[fieldId].asTextBytes();
+  }
 
   @Override
-	public int getInt4(int fieldId) {
-		return values[fieldId].asInt4();
-	}
+  public short getInt2(int fieldId) {
+    return values[fieldId].asInt2();
+  }
 
   @Override
-	public long getInt8(int fieldId) {
-		return values[fieldId].asInt8();
-	}
+  public int getInt4(int fieldId) {
+    return values[fieldId].asInt4();
+  }
 
   @Override
-	public float getFloat4(int fieldId) {
-		return values[fieldId].asFloat4();
-	}
+  public long getInt8(int fieldId) {
+    return values[fieldId].asInt8();
+  }
 
   @Override
-	public double getFloat8(int fieldId) {
-		return values[fieldId].asFloat8();
-	}
+  public float getFloat4(int fieldId) {
+    return values[fieldId].asFloat4();
+  }
 
-	public Inet4Datum getIPv4(int fieldId) {
-		return (Inet4Datum) values[fieldId];
-	}
+  @Override
+  public double getFloat8(int fieldId) {
+    return values[fieldId].asFloat8();
+  }
 
-	public byte [] getIPv4Bytes(int fieldId) {
-		return values[fieldId].asByteArray();
-	}
+  public Inet4Datum getIPv4(int fieldId) {
+    return (Inet4Datum) values[fieldId];
+  }
+
+  public byte [] getIPv4Bytes(int fieldId) {
+    return values[fieldId].asByteArray();
+  }
 
-	public InetAddress getIPv6(int fieldId) {
-		throw new UnimplementedException("IPv6 is unsupported yet");
-	}
+  public InetAddress getIPv6(int fieldId) {
+    throw new UnimplementedException("IPv6 is unsupported yet");
+  }
+
+  public byte[] getIPv6Bytes(int fieldId) {
+    throw new UnimplementedException("IPv6 is unsupported yet");
+  }
 
-	public byte[] getIPv6Bytes(int fieldId) {
-	  throw new UnimplementedException("IPv6 is unsupported yet");
-	}
+  @Override
+  public String getText(int fieldId) {
+    return values[fieldId].asChars();
+  }
 
   @Override
-	public String getText(int fieldId) {
-		return values[fieldId].asChars();
-	}
+  public TimeMeta getTimeDate(int fieldId) {
+    return values[fieldId].asTimeMeta();
+  }
 
   @Override
   public ProtobufDatum getProtobufDatum(int fieldId) {
@@ -193,7 +211,7 @@ public class VTuple implements Tuple, Cloneable {
   }
 
   @Override
-  public Tuple clone() throws CloneNotSupportedException {
+  public VTuple clone() throws CloneNotSupportedException {
     VTuple tuple = (VTuple) super.clone();
 
     tuple.values = new Datum[size()];
@@ -203,13 +221,13 @@ public class VTuple implements Tuple, Cloneable {
 
   @Override
   public String toString() {
-		return toDisplayString(getValues());
-	}
+    return toDisplayString(getValues());
+  }
 
-	@Override
-	public int hashCode() {
-	  return Arrays.hashCode(values);
-	}
+  @Override
+  public int hashCode() {
+    return Arrays.hashCode(values);
+  }
 
   @Override
   public Datum[] getValues() {

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java b/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java
index 15b4236..570873d 100644
--- a/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java
+++ b/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeUtil.java
@@ -2170,13 +2170,17 @@ public class DateTimeUtil {
   }
 
   public static TimeMeta getUTCDateTime(Int8Datum int8Datum){
-    long usecs = int8Datum.asInt8()%DateTimeConstants.USECS_PER_MSEC;
-    long julianTimestamp = javaTimeToJulianTime(int8Datum.asInt8()/DateTimeConstants.USECS_PER_MSEC);
+    return getUTCDateTime(int8Datum.asInt8());
+  }
+
+  public static TimeMeta getUTCDateTime(long time) {
+    long usecs = time % DateTimeConstants.USECS_PER_MSEC;
+    long julianTimestamp = javaTimeToJulianTime(time / DateTimeConstants.USECS_PER_MSEC);
     TimeMeta tm = new TimeMeta();
-    
+
     julianTimestamp += usecs;
     toJulianTimeMeta(julianTimestamp, tm);
     return tm;
   }
-  
+
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/test/java/org/apache/tajo/datum/TestTimestampDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestTimestampDatum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestTimestampDatum.java
index 06e50f7..7cb3123 100644
--- a/tajo-common/src/test/java/org/apache/tajo/datum/TestTimestampDatum.java
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestTimestampDatum.java
@@ -120,7 +120,7 @@ public class TestTimestampDatum {
   public final void testTimeZone() {
     TimestampDatum datum = new TimestampDatum(DateTimeUtil.toJulianTimestamp(2014, 5, 1, 15, 20, 30, 0));
     assertEquals("2014-05-01 15:20:30", datum.asChars());
-    assertEquals("2014-05-02 00:20:30+09", datum.asChars(TimeZone.getTimeZone("GMT+9"), true));
+    assertEquals("2014-05-02 00:20:30+09", TimestampDatum.asChars(datum.asTimeMeta(), TimeZone.getTimeZone("GMT+9"), true));
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeFormat.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeFormat.java b/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeFormat.java
index 2b5dba0..a9af36c 100644
--- a/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeFormat.java
+++ b/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeFormat.java
@@ -142,7 +142,7 @@ public class TestDateTimeFormat {
   private void evalToCharAndAssert(String dateTimeText,
                                    String toTimestampFormatText, String toCharFormatText, String expected) {
     TimestampDatum datum = DateTimeFormat.toTimestamp(dateTimeText, toTimestampFormatText);
-    String toCharResult = DateTimeFormat.to_char(datum.toTimeMeta(), toCharFormatText);
+    String toCharResult = DateTimeFormat.to_char(datum.asTimeMeta(), toCharFormatText);
     assertEquals(expected, toCharResult);
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java
index 3ccb02d..a1805c4 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgDouble.java
@@ -59,9 +59,8 @@ public class AvgDouble extends AggFunction<Datum> {
   @Override
   public void eval(FunctionContext ctx, Tuple params) {
     AvgContext avgCtx = (AvgContext) ctx;
-    Datum datum = params.get(0);
-    if (datum.isNotNull()) {
-      avgCtx.sum += datum.asFloat8();
+    if (!params.isBlankOrNull(0)) {
+      avgCtx.sum += params.getFloat8(0);
       avgCtx.count++;
     }
   }
@@ -69,11 +68,10 @@ public class AvgDouble extends AggFunction<Datum> {
   @Override
   public void merge(FunctionContext ctx, Tuple part) {
     AvgContext avgCtx = (AvgContext) ctx;
-    Datum d = part.get(0);
-    if (d instanceof NullDatum) {
+    if (part.isBlankOrNull(0)) {
       return;
     }
-    ProtobufDatum datum = (ProtobufDatum) d;
+    ProtobufDatum datum = (ProtobufDatum) part.getProtobufDatum(0);
     AvgDoubleProto proto = (AvgDoubleProto) datum.get();
     avgCtx.sum += proto.getSum();
     avgCtx.count += proto.getCount();

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java
index 8162319..1e778a8 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgFloat.java
@@ -44,9 +44,8 @@ public class AvgFloat extends AvgDouble {
   @Override
   public void eval(FunctionContext ctx, Tuple params) {
     AvgContext avgCtx = (AvgContext) ctx;
-    Datum datum = params.get(0);
-    if (datum.isNotNull()) {
-      avgCtx.sum += datum.asFloat4();
+    if (!params.isBlankOrNull(0)) {
+      avgCtx.sum += params.getFloat4(0);
       avgCtx.count++;
     }
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java
index 1950fb1..b49c61b 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgInt.java
@@ -45,9 +45,8 @@ public class AvgInt extends AvgLong {
   @Override
   public void eval(FunctionContext ctx, Tuple params) {
     AvgContext avgCtx = (AvgContext) ctx;
-    Datum datum = params.get(0);
-    if (datum.isNotNull()) {
-      avgCtx.sum += datum.asInt4();
+    if (!params.isBlankOrNull(0)) {
+      avgCtx.sum += params.getInt4(0);
       avgCtx.count++;
     }
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java
index 88f8486..651f540 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/AvgLong.java
@@ -57,9 +57,8 @@ public class AvgLong extends AggFunction<Datum> {
   @Override
   public void eval(FunctionContext ctx, Tuple params) {
     AvgContext avgCtx = (AvgContext) ctx;
-    Datum datum = params.get(0);
-    if (datum.isNotNull()) {
-      avgCtx.sum += datum.asInt8();
+    if (!params.isBlankOrNull(0)) {
+      avgCtx.sum += params.getInt8(0);
       avgCtx.count++;
     }
   }
@@ -67,11 +66,10 @@ public class AvgLong extends AggFunction<Datum> {
   @Override
   public void merge(FunctionContext ctx, Tuple part) {
     AvgContext avgCtx = (AvgContext) ctx;
-    Datum d = part.get(0);
-    if (d instanceof NullDatum) {
+    if (part.isBlankOrNull(0)) {
       return;
     }
-    ProtobufDatum datum = (ProtobufDatum) d;
+    ProtobufDatum datum = (ProtobufDatum) part.getProtobufDatum(0);
     AvgLongProto proto = (AvgLongProto) datum.get();
     avgCtx.sum += proto.getSum();
     avgCtx.count += proto.getCount();

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Coalesce.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Coalesce.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Coalesce.java
index 474f771..05847ad 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Coalesce.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Coalesce.java
@@ -33,11 +33,10 @@ public abstract class Coalesce extends GeneralFunction {
   public Datum eval(Tuple params) {
     int paramSize = params.size();
     for (int i = 0; i < paramSize; i++) {
-      Datum datum = params.get(i);
-      if (datum instanceof NullDatum) {
+      if (params.isBlankOrNull(i)) {
         continue;
       }
-      return datum;
+      return params.asDatum(i);
     }
     return NullDatum.get();
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java
index 5e41dc9..2eabe0b 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountRows.java
@@ -60,7 +60,7 @@ public class CountRows extends AggFunction<Datum> {
 
   @Override
   public void merge(FunctionContext ctx, Tuple part) {
-    ((CountRowContext) ctx).count += part.get(0).asInt8();
+    ((CountRowContext) ctx).count += part.getInt8(0);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java
index 1abfcb7..a2f06ff 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValue.java
@@ -47,7 +47,7 @@ public final class CountValue extends CountRows {
 
   @Override
   public void eval(FunctionContext ctx, Tuple params) {
-    if (!(params.get(0) instanceof NullDatum)) {
+    if (!params.isBlankOrNull(0)) {
       ((CountRowContext) ctx).count++;
     }
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java
index 675193f..f247968 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/CountValueDistinct.java
@@ -53,13 +53,14 @@ public final class CountValueDistinct extends CountRows {
   }
 
   @Override
-  public void merge(FunctionContext context, Tuple part) {
+  public void merge(FunctionContext context, Tuple params) {
     CountDistinctValueContext distinctContext = (CountDistinctValueContext) context;
-    Datum value = part.get(0);
-
-    if (!value.isNull() && (distinctContext.latest == null || (!distinctContext.latest.equals(value)))) {
-      distinctContext.latest = value;
-      distinctContext.count++;
+    if (!params.isBlankOrNull(0)) {
+      Datum value = params.asDatum(0);
+      if (distinctContext.latest == null || !distinctContext.latest.equals(value)) {
+        distinctContext.latest = value;
+        distinctContext.count++;
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Date.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Date.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Date.java
index aee7c60..05928d6 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Date.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Date.java
@@ -53,7 +53,7 @@ public class Date extends GeneralFunction {
   public Int8Datum eval(Tuple params) {
     try {
       return DatumFactory.createInt8(new SimpleDateFormat(dateFormat)
-          .parse(params.get(0).asChars()).getTime());
+          .parse(params.getText(0)).getTime());
     } catch (ParseException e) {
       LOG.error(e);
       return null;

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/LastValue.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/LastValue.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/LastValue.java
index 16edb17..190bd81 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/LastValue.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/LastValue.java
@@ -40,9 +40,8 @@ public abstract class LastValue extends AggFunction<Datum> {
   @Override
   public void eval(FunctionContext ctx, Tuple params) {
     LastValueContext lastValueCtx = (LastValueContext) ctx;
-    Datum datum = params.get(0);
-    if ( datum.isNotNull() ) {
-      lastValueCtx.last = datum;
+    if (!params.isBlankOrNull(0)) {
+      lastValueCtx.last = params.asDatum(0);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/5c2aee23/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Lead.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Lead.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Lead.java
index 2e95eb7..8edf1fb 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Lead.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/builtin/Lead.java
@@ -45,19 +45,19 @@ public abstract class Lead extends AggFunction<Datum> {
       if (params.size() == 1) {
         leadCtx.leadNum = 1;
       } else {
-        leadCtx.leadNum = params.get(1).asInt4();
+        leadCtx.leadNum = params.getInt4(1);
       }
     }
 
     if (leadCtx.leadNum > 0) {
       leadCtx.leadNum --;
     } else {
-      leadCtx.leadBuffer.add(params.get(0));
+      leadCtx.leadBuffer.add(params.asDatum(0));
     }
 
     if (leadCtx.defaultDatum == null) {
       if (params.size() == 3) {
-        leadCtx.defaultDatum = params.get(2);
+        leadCtx.defaultDatum = params.asDatum(2);
       } else {
         leadCtx.defaultDatum = NullDatum.get();
       }