You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by jh...@apache.org on 2016/04/27 10:31:05 UTC

[4/4] tajo git commit: TAJO-2110: Fix incorrect DateTime and remove hard coded tests.

TAJO-2110: Fix incorrect DateTime and remove hard coded tests.

Closes #993


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

Branch: refs/heads/master
Commit: aad78a4e7d8c2c2161bfb149e1d1343fb4352d59
Parents: 73ac4b8
Author: Jinho Kim <jh...@apache.org>
Authored: Wed Apr 27 17:29:59 2016 +0900
Committer: Jinho Kim <jh...@apache.org>
Committed: Wed Apr 27 17:29:59 2016 +0900

----------------------------------------------------------------------
 CHANGES                                         |  2 +
 .../org/apache/tajo/catalog/CatalogUtil.java    | 48 ++++++++--
 .../org/apache/tajo/catalog/TestTableDesc.java  |  7 +-
 .../org/apache/tajo/catalog/TestTableMeta.java  | 16 ++--
 .../org/apache/tajo/catalog/TestCatalog.java    |  3 +-
 .../TestCatalogAgainstCaseSensitivity.java      |  3 +-
 .../tajo/cli/tsql/CliClientParamsFactory.java   |  2 +
 .../cli/tsql/commands/DescTableCommand.java     |  2 +-
 .../tajo/client/CatalogAdminClientImpl.java     |  5 +-
 .../tajo/client/ClientParameterHelper.java      |  2 +
 .../apache/tajo/client/ClientParameters.java    |  1 +
 .../org/apache/tajo/client/QueryClientImpl.java |  6 +-
 .../org/apache/tajo/client/TajoClientUtil.java  |  2 +-
 .../org/apache/tajo/jdbc/TajoResultSetBase.java | 23 ++---
 .../org/apache/tajo/jdbc/WaitingResultSet.java  |  3 +-
 .../org/apache/tajo/BackendTestingUtil.java     |  2 +-
 .../java/org/apache/tajo/QueryTestCaseBase.java | 10 +-
 .../org/apache/tajo/TajoTestingCluster.java     | 15 +--
 .../java/org/apache/tajo/TajoConstants.java     |  3 -
 .../java/org/apache/tajo/conf/TajoConf.java     |  2 -
 .../java/org/apache/tajo/datum/DateDatum.java   | 60 +++++-------
 .../main/java/org/apache/tajo/datum/Datum.java  |  2 +-
 .../org/apache/tajo/datum/DatumFactory.java     | 28 ++----
 .../org/apache/tajo/datum/IntervalDatum.java    | 17 +++-
 .../java/org/apache/tajo/datum/TimeDatum.java   | 55 +++++------
 .../org/apache/tajo/datum/TimestampDatum.java   | 55 ++++++-----
 .../apache/tajo/util/datetime/DateTimeUtil.java | 44 +++++++--
 .../org/apache/tajo/util/datetime/TimeMeta.java | 20 ++++
 .../org/apache/tajo/datum/TestDateDatum.java    |  4 -
 .../apache/tajo/datum/TestIntervalDatum.java    | 19 ++--
 .../org/apache/tajo/datum/TestTimeDatum.java    |  2 +-
 .../apache/tajo/datum/TestTimestampDatum.java   |  8 +-
 .../org/apache/tajo/util/TestDateTimeUtil.java  | 12 ++-
 .../apache/tajo/cli/tools/TestDDLBuilder.java   | 10 +-
 .../org/apache/tajo/cli/tools/TestTajoDump.java | 25 +++--
 .../org/apache/tajo/cli/tsql/TestTajoCli.java   | 13 ++-
 .../engine/codegen/TestEvalCodeGenerator.java   | 40 ++++----
 .../apache/tajo/engine/eval/ExprTestBase.java   | 75 +++++++--------
 .../tajo/engine/eval/TestEvalTreeUtil.java      |  3 +-
 .../apache/tajo/engine/eval/TestPredicates.java |  8 +-
 .../tajo/engine/eval/TestSQLExpression.java     | 90 ++++++++++++++++--
 .../function/TestConditionalExpressions.java    |  2 +-
 .../engine/function/TestDateTimeFunctions.java  | 97 ++++++++-----------
 .../tajo/engine/function/TestJsonFunctions.java |  2 +-
 .../function/TestPatternMatchingPredicates.java |  2 +-
 .../TestStringOperatorsAndFunctions.java        | 20 ++--
 .../planner/TestEvalNodeToExprConverter.java    |  4 +-
 .../engine/planner/TestJoinOrderAlgorithm.java  |  5 +-
 .../engine/planner/TestLogicalOptimizer.java    |  3 +-
 .../tajo/engine/planner/TestLogicalPlanner.java | 15 ++-
 .../tajo/engine/planner/TestPlannerUtil.java    |  3 +-
 .../planner/physical/TestExternalSortExec.java  |  7 +-
 .../physical/TestFullOuterHashJoinExec.java     |  9 +-
 .../physical/TestFullOuterMergeJoinExec.java    | 11 ++-
 .../planner/physical/TestHashAntiJoinExec.java  |  5 +-
 .../planner/physical/TestHashJoinExec.java      | 10 +-
 .../planner/physical/TestHashSemiJoinExec.java  |  6 +-
 .../physical/TestLeftOuterHashJoinExec.java     |  9 +-
 .../planner/physical/TestMergeJoinExec.java     |  6 +-
 .../planner/physical/TestPhysicalPlanner.java   | 16 ++--
 .../physical/TestProgressExternalSortExec.java  |  2 +-
 .../engine/planner/physical/TestRadixSort.java  |  7 +-
 .../physical/TestRightOuterHashJoinExec.java    |  7 +-
 .../physical/TestRightOuterMergeJoinExec.java   | 11 ++-
 .../engine/planner/physical/TestSortExec.java   |  7 +-
 .../planner/physical/TestSortIntersectExec.java |  5 +-
 .../tajo/engine/query/TestJsonWithTimezone.java |  8 +-
 .../tajo/engine/query/TestSelectQuery.java      |  8 +-
 .../apache/tajo/engine/query/TestTimezone.java  | 23 ++++-
 .../apache/tajo/engine/util/BenchmarkSort.java  | 12 +--
 .../tajo/master/TestExecutionBlockCursor.java   |  5 +-
 .../apache/tajo/storage/TestQueryOnOrcFile.java |  3 -
 .../org/apache/tajo/storage/TestRowFile.java    |  2 +-
 .../apache/tajo/worker/TestTaskExecutor.java    |  4 +-
 .../testTimezonedTable2.result                  |  6 +-
 .../TestSelectQuery/testTimezonedTable2.result  |  6 +-
 .../results/TestTajoCli/testDescTable1.result   |  6 +-
 .../results/TestTajoCli/testDescTable2.result   |  8 +-
 .../testDescTableForNestedSchema.result         |  6 +-
 .../results/TestTajoDump/testDump1.result       |  2 +-
 .../results/TestTajoDump/testDump2.result       |  2 +-
 .../results/TestTajoDump/testDump3.result       |  2 +-
 .../TestTajoDump/testPartitionsDump.result      |  4 +-
 .../testBuildDDLForBaseTable.result             |  2 +-
 .../testBuildDDLForExternalTable.result         |  2 +-
 .../testBuildDDLQuotedTableName1.result         |  2 +-
 .../testBuildDDLQuotedTableName2.result         |  2 +-
 .../java/org/apache/tajo/benchmark/TPCH.java    |  6 +-
 .../tajo/engine/function/datetime/AddDays.java  | 17 +++-
 .../engine/function/datetime/AddMonths.java     | 18 +++-
 .../engine/function/datetime/CurrentDate.java   | 10 +-
 .../engine/function/datetime/CurrentTime.java   | 15 ++-
 .../function/datetime/DatePartFromTime.java     | 14 +--
 .../datetime/DatePartFromTimestamp.java         | 16 ++--
 .../function/datetime/ToCharTimestamp.java      | 13 +--
 .../function/datetime/ToTimestampText.java      | 22 ++---
 .../planner/physical/ColPartitionStoreExec.java |  2 +-
 .../planner/physical/ExternalSortExec.java      |  2 +-
 .../physical/HashShuffleFileWriteExec.java      |  2 +-
 .../engine/planner/physical/InsertRowsExec.java |  2 +-
 .../physical/RangeShuffleFileWriteExec.java     |  2 +-
 .../engine/planner/physical/StoreTableExec.java |  2 +-
 .../tajo/master/exec/CreateTableExecutor.java   |  2 +-
 .../apache/tajo/master/exec/QueryExecutor.java  |  6 ++
 .../apache/tajo/worker/TaskAttemptContext.java  |  3 +
 tajo-docs/src/main/sphinx/jdbc_driver.rst       |  1 +
 tajo-docs/src/main/sphinx/time_zone.rst         |  4 +-
 .../org/apache/tajo/jdbc/TestResultSet.java     | 29 +++---
 .../java/org/apache/tajo/jdbc/TestTajoJdbc.java | 99 ++++++++++++++++++++
 .../org/apache/tajo/plan/ExprAnnotator.java     | 28 ++----
 .../org/apache/tajo/plan/LogicalPlanner.java    |  9 +-
 .../org/apache/tajo/plan/TablePropertyUtil.java | 21 ++++-
 .../org/apache/tajo/plan/expr/CastEval.java     | 35 +++----
 .../org/apache/tajo/plan/expr/EvalContext.java  | 14 +++
 .../org/apache/tajo/plan/expr/EvalNode.java     |  1 -
 .../tajo/plan/expr/GeneralFunctionEval.java     | 10 +-
 .../plan/exprrewrite/rules/ConstantFolding.java | 21 +++--
 .../ClassBasedScalarFunctionInvoke.java         |  1 +
 .../plan/function/FunctionInvokeContext.java    | 10 ++
 .../tajo/plan/function/GeneralFunction.java     | 17 ++++
 .../function/python/PythonScriptEngine.java     | 11 ++-
 .../stream/TextFieldSerializerDeserializer.java | 43 +++------
 .../tajo/plan/serder/EvalNodeSerializer.java    |  3 -
 .../tajo/plan/verifier/ExprsVerifier.java       |  3 +-
 tajo-plan/src/main/proto/Plan.proto             |  1 -
 .../org/apache/tajo/plan/TestLogicalNode.java   | 13 ++-
 .../org/apache/tajo/storage/StorageUtil.java    |  3 +
 .../storage/TextSerializerDeserializer.java     | 12 +--
 .../tajo/storage/json/JsonLineDeserializer.java | 19 +---
 .../tajo/storage/json/JsonLineSerializer.java   | 20 +---
 .../apache/tajo/storage/orc/ORCAppender.java    | 13 +--
 .../org/apache/tajo/storage/orc/OrcScanner.java |  9 +-
 .../text/TextFieldSerializerDeserializer.java   | 46 ++++-----
 .../thirdparty/orc/TreeReaderFactory.java       | 12 +--
 .../tajo/storage/thirdparty/orc/WriterImpl.java | 18 ++--
 .../tajo/storage/TestCompressionStorages.java   |  2 +-
 .../tajo/storage/TestDelimitedTextFile.java     | 18 ++--
 .../apache/tajo/storage/TestFileSystems.java    |  3 +-
 .../apache/tajo/storage/TestFileTablespace.java | 11 ++-
 .../org/apache/tajo/storage/TestLineReader.java |  9 +-
 .../apache/tajo/storage/TestMergeScanner.java   |  6 +-
 .../org/apache/tajo/storage/TestStorages.java   | 64 +++++--------
 .../apache/tajo/storage/avro/TestAvroUtil.java  | 10 +-
 .../apache/tajo/storage/index/TestBSTIndex.java | 22 ++---
 .../index/TestSingleCSVFileBSTIndex.java        |  4 +-
 .../apache/tajo/storage/json/TestJsonSerDe.java |  5 +-
 .../tajo/storage/raw/TestDirectRawFile.java     |  6 +-
 147 files changed, 1106 insertions(+), 867 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index b729cce..8351ee4 100644
--- a/CHANGES
+++ b/CHANGES
@@ -137,6 +137,8 @@ Release 0.12.0 - unreleased
 
   BUG FIXES
 
+    TAJO-2110: Fix incorrect DateTime and remove hard coded tests. (jinho)
+
     TAJO-2119: Invalid sort result when sort key columns contain non-ascii values. 
     (jihoon)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java
index 76990f2..0ab0c6f 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java
@@ -28,13 +28,10 @@ import org.apache.tajo.annotation.Nullable;
 import org.apache.tajo.catalog.partition.PartitionDesc;
 import org.apache.tajo.catalog.partition.PartitionMethodDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
-import org.apache.tajo.catalog.proto.CatalogProtos.PartitionKeyProto;
-import org.apache.tajo.catalog.proto.CatalogProtos.SchemaProto;
-import org.apache.tajo.catalog.proto.CatalogProtos.DataFormat;
-import org.apache.tajo.catalog.proto.CatalogProtos.TableDescProto;
-import org.apache.tajo.catalog.proto.CatalogProtos.TableIdentifierProto;
+import org.apache.tajo.catalog.proto.CatalogProtos.*;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.DataType;
+import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.exception.InvalidOperationException;
 import org.apache.tajo.exception.UndefinedOperatorException;
 import org.apache.tajo.storage.StorageConstants;
@@ -321,8 +318,8 @@ public class CatalogUtil {
     }
   }
 
-  public static TableMeta newTableMeta(String dataFormat) {
-    KeyValueSet defaultProperties = CatalogUtil.newDefaultProperty(dataFormat);
+  public static TableMeta newTableMeta(String dataFormat, TajoConf conf) {
+    KeyValueSet defaultProperties = CatalogUtil.newDefaultProperty(dataFormat, conf);
     return new TableMeta(dataFormat, defaultProperties);
   }
 
@@ -890,13 +887,32 @@ public class CatalogUtil {
     return pair;
   }
 
-  /*
+  /**
    * It is the relationship graph of type conversions.
    * It contains tuples, each of which (LHS type, RHS type, Result type).
    */
 
   public static final Map<Type, Map<Type, Type>> OPERATION_CASTING_MAP = Maps.newHashMap();
 
+  /**
+   * It is the casting direction of relationship graph
+   */
+  private static final Map<Type, Map<Type, Direction>> CASTING_DIRECTION_MAP = Maps.newHashMap();
+
+  public static Direction getCastingDirection(Type lhs, Type rhs) {
+    Direction direction = TUtil.getFromNestedMap(CatalogUtil.CASTING_DIRECTION_MAP, lhs, rhs);
+    if (direction == null) {
+      return Direction.BOTH;
+    }
+    return direction;
+  }
+
+  public enum Direction {
+    LHS,
+    RHS,
+    BOTH
+  }
+
   static {
     // Type Conversion Map
     TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.BOOLEAN, Type.BOOLEAN, Type.BOOLEAN);
@@ -962,7 +978,18 @@ public class CatalogUtil {
     TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.TIMESTAMP, Type.VARCHAR, Type.TEXT);
 
     TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.TIME, Type.TIME, Type.TIME);
+    TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.TIME, Type.DATE, Type.TIMESTAMP);
+    TUtil.putToNestedMap(CASTING_DIRECTION_MAP, Type.TIME, Type.DATE, Direction.RHS);
+
     TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.DATE, Type.DATE, Type.DATE);
+    TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.DATE, Type.TIME, Type.TIMESTAMP);
+    TUtil.putToNestedMap(CASTING_DIRECTION_MAP, Type.DATE, Type.TIME, Direction.LHS);
+
+    TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.DATE, Type.INTERVAL, Type.TIMESTAMP);
+    TUtil.putToNestedMap(CASTING_DIRECTION_MAP, Type.DATE, Type.INTERVAL, Direction.LHS);
+
+    TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.INTERVAL, Type.DATE, Type.TIMESTAMP);
+    TUtil.putToNestedMap(CASTING_DIRECTION_MAP, Type.INTERVAL, Type.DATE, Direction.RHS);
 
     TUtil.putToNestedMap(OPERATION_CASTING_MAP, Type.INET4, Type.INET4, Type.INET4);
   }
@@ -980,8 +1007,11 @@ public class CatalogUtil {
    * @param dataFormat DataFormat
    * @return Table properties
    */
-  public static KeyValueSet newDefaultProperty(String dataFormat) {
+  public static KeyValueSet newDefaultProperty(String dataFormat, TajoConf conf) {
     KeyValueSet options = new KeyValueSet();
+    // set default timezone to the system timezone
+    options.set(StorageConstants.TIMEZONE, conf.getSystemTimezone().getID());
+
     if (dataFormat.equalsIgnoreCase(BuiltinStorages.TEXT)) {
       options.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     } else if (dataFormat.equalsIgnoreCase("JSON")) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java
index 085975b..f599406 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableDesc.java
@@ -19,11 +19,13 @@
 package org.apache.tajo.catalog;
 
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.catalog.json.CatalogGsonHelper;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.catalog.statistics.ColumnStats;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.common.TajoDataTypes.Type;
+import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.util.CommonTestingUtil;
 import org.junit.Before;
 import org.junit.Test;
@@ -33,6 +35,7 @@ import java.io.IOException;
 import static org.junit.Assert.assertEquals;
 
 public class TestTableDesc {
+  TajoConf conf = new TajoConf();
 	TableMeta info;
   Schema schema;
 	TableDesc desc;
@@ -45,7 +48,7 @@ public class TestTableDesc {
         .add("name", Type.BLOB)
         .add("addr", Type.TEXT)
         .build();
-    info = CatalogUtil.newTableMeta("TEXT");
+    info = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     path = new Path(CommonTestingUtil.getTestDir(), "table1");
     desc = new TableDesc("table1", schema, info, path.toUri());
     stats = new TableStats();
@@ -72,7 +75,7 @@ public class TestTableDesc {
         .add("name", Type.BLOB)
         .add("addr", Type.TEXT)
         .build();
-    TableMeta info = CatalogUtil.newTableMeta("TEXT");
+    TableMeta info = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     testClone(info);
 
     Path path = new Path(CommonTestingUtil.getTestDir(), "tajo");

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableMeta.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableMeta.java b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableMeta.java
index c6f4d1a..124b5ee 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableMeta.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableMeta.java
@@ -21,6 +21,7 @@ package org.apache.tajo.catalog;
 import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.catalog.json.CatalogGsonHelper;
 import org.apache.tajo.catalog.proto.CatalogProtos.TableProto;
+import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos;
 import org.junit.Before;
 import org.junit.Test;
@@ -28,16 +29,17 @@ import org.junit.Test;
 import static org.junit.Assert.*;
 
 public class TestTableMeta {
+  TajoConf conf = new TajoConf();
   TableMeta meta = null;
-  
+
   @Before
   public void setUp() {
-    meta = CatalogUtil.newTableMeta("TEXT");
+    meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
   }
   
   @Test
   public void testTableMetaTableProto() {
-    TableMeta meta1 = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta1 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     
     TableMeta meta2 = new TableMeta(meta1.getProto());
     assertEquals(meta1, meta2);
@@ -45,7 +47,7 @@ public class TestTableMeta {
   
   @Test
   public final void testClone() throws CloneNotSupportedException {
-    TableMeta meta1 = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta1 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     
     TableMeta meta2 = (TableMeta) meta1.clone();
     assertEquals(meta1.getDataFormat(), meta2.getDataFormat());
@@ -54,7 +56,7 @@ public class TestTableMeta {
   
   @Test
   public void testSchema() throws CloneNotSupportedException {
-    TableMeta meta1 = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta1 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     TableMeta meta2 = (TableMeta) meta1.clone();
     assertEquals(meta1, meta2);
   }
@@ -66,7 +68,7 @@ public class TestTableMeta {
   
   @Test
   public void testEqualsObject() {
-    TableMeta meta2 = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta2 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     assertTrue(meta.equals(meta2));
     assertNotSame(meta, meta2);
   }
@@ -79,7 +81,7 @@ public class TestTableMeta {
 
 		int MAX_COUNT = 17;
 
-		TableMeta meta1 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT);
+		TableMeta meta1 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
 		for (int i = 0; i < MAX_COUNT; i++) {
 			meta1.putProperty("key"+i, "value"+i);
 		}

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
index 9c1e430..14d6e30 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
@@ -20,6 +20,7 @@ package org.apache.tajo.catalog;
 
 import com.google.common.collect.Sets;
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.dictionary.InfoSchemaMetadataDictionary;
 import org.apache.tajo.catalog.partition.PartitionDesc;
@@ -433,7 +434,7 @@ public class TestCatalog {
 
     String tableName = "indexed";
 
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, server.getConf());
     return new TableDesc(
         CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, tableName), relationSchema, meta,
         new Path(CommonTestingUtil.getTestDir(), "indexed").toUri());

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogAgainstCaseSensitivity.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogAgainstCaseSensitivity.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogAgainstCaseSensitivity.java
index 6af2798..6b7e458 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogAgainstCaseSensitivity.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogAgainstCaseSensitivity.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.catalog;
 
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.catalog.partition.PartitionDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos.*;
 import org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto.AlterTablespaceCommand;
@@ -352,7 +353,7 @@ public class TestCatalogAgainstCaseSensitivity {
     TableDesc tableDesc = new TableDesc(
         CatalogUtil.buildFQName(databaseName, tableName),
         tableSchema,
-        CatalogUtil.newTableMeta("JSON"),
+        CatalogUtil.newTableMeta(BuiltinStorages.JSON, server.getConf()),
         URI.create("hdfs://xxx.com/json_Table")
     );
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/CliClientParamsFactory.java
----------------------------------------------------------------------
diff --git a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/CliClientParamsFactory.java b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/CliClientParamsFactory.java
index 1d40db3..a4b0c1d 100644
--- a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/CliClientParamsFactory.java
+++ b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/CliClientParamsFactory.java
@@ -24,6 +24,7 @@ import org.apache.tajo.client.ClientParameters;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
+import java.util.TimeZone;
 
 class CliClientParamsFactory {
   static Map<String, String> DEFAULT_PARAMS = new HashMap<>();
@@ -35,6 +36,7 @@ class CliClientParamsFactory {
     DEFAULT_PARAMS.put(ClientParameters.RETRY, "3");
     DEFAULT_PARAMS.put(ClientParameters.ROW_FETCH_SIZE, "200");
     DEFAULT_PARAMS.put(ClientParameters.USE_COMPRESSION, "false");
+    DEFAULT_PARAMS.put(ClientParameters.TIMEZONE, TimeZone.getDefault().getID());
   }
 
   public static Properties get(@Nullable Properties connParam) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java
----------------------------------------------------------------------
diff --git a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java
index 6f01911..43fcf2e 100644
--- a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java
+++ b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java
@@ -118,7 +118,7 @@ public class DescTableCommand extends TajoShellCommand {
           FileUtil.humanReadableByteCount(desc.getStats().getNumBytes(),
               true)).append("\n");
     }
-    sb.append("Options: \n");
+    sb.append("Options:\n");
     for(Map.Entry<String, String> entry : desc.getMeta().toMap().entrySet()){
 
       /*

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java b/tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java
index 97f28a6..f1a4712 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java
@@ -20,7 +20,6 @@ package org.apache.tajo.client;
 
 import com.google.protobuf.ServiceException;
 import org.apache.tajo.annotation.Nullable;
-import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.catalog.TableMeta;
@@ -175,7 +174,7 @@ public class CatalogAdminClientImpl implements CatalogAdminClient {
     throwsIfThisError(res.getState(), UnavailableTableLocationException.class);
 
     ensureOk(res.getState());
-    return CatalogUtil.newTableDesc(res.getTable());
+    return new TableDesc(res.getTable());
   }
 
   @Override
@@ -241,7 +240,7 @@ public class CatalogAdminClientImpl implements CatalogAdminClient {
     }
 
     ensureOk(res.getState());
-    return CatalogUtil.newTableDesc(res.getTable());
+    return new TableDesc(res.getTable());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-client/src/main/java/org/apache/tajo/client/ClientParameterHelper.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/ClientParameterHelper.java b/tajo-client/src/main/java/org/apache/tajo/client/ClientParameterHelper.java
index 8549178..fc5bc7d 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/ClientParameterHelper.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/ClientParameterHelper.java
@@ -30,6 +30,7 @@ import java.util.concurrent.TimeUnit;
 
 import static org.apache.tajo.SessionVars.COMPRESSED_RESULT_TRANSFER;
 import static org.apache.tajo.SessionVars.FETCH_ROWNUM;
+import static org.apache.tajo.SessionVars.TIMEZONE;
 import static org.apache.tajo.client.ClientParameterHelper.ActionType.CONNECTION_PARAM;
 import static org.apache.tajo.client.ClientParameterHelper.ActionType.SESSION_UPDATE;
 import static org.apache.tajo.rpc.RpcConstants.CLIENT_CONNECTION_TIMEOUT;
@@ -75,6 +76,7 @@ class ClientParameterHelper {
       }
     });
     PARAMETERS.put(ClientParameters.RETRY, new SimpleConnectionParamAction(RpcConstants.CLIENT_RETRY_NUM));
+    PARAMETERS.put(ClientParameters.TIMEZONE, new SimpleSessionAction(TIMEZONE));
   }
 
   enum ActionType {

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-client/src/main/java/org/apache/tajo/client/ClientParameters.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/ClientParameters.java b/tajo-client/src/main/java/org/apache/tajo/client/ClientParameters.java
index e3ee019..d5069d5 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/ClientParameters.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/ClientParameters.java
@@ -29,4 +29,5 @@ public interface ClientParameters {
   String CONNECT_TIMEOUT = "connectTimeout";
   String SOCKET_TIMEOUT = "socketTimeout";
   String RETRY = "retry";
+  String TIMEZONE = "timezone";
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-client/src/main/java/org/apache/tajo/client/QueryClientImpl.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/QueryClientImpl.java b/tajo-client/src/main/java/org/apache/tajo/client/QueryClientImpl.java
index 3618f1f..921da09 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/QueryClientImpl.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/QueryClientImpl.java
@@ -26,14 +26,12 @@ import org.apache.tajo.QueryId;
 import org.apache.tajo.QueryIdFactory;
 import org.apache.tajo.SessionVars;
 import org.apache.tajo.TajoIdProtos.SessionIdProto;
+import org.apache.tajo.TajoProtos.CodecType;
 import org.apache.tajo.TajoProtos.QueryState;
 import org.apache.tajo.auth.UserRoleInfo;
-import org.apache.tajo.catalog.CatalogUtil;
-import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.client.v2.exception.ClientUnableToConnectException;
-import org.apache.tajo.TajoProtos.CodecType;
 import org.apache.tajo.exception.*;
 import org.apache.tajo.ipc.ClientProtos.*;
 import org.apache.tajo.ipc.QueryMasterClientProtocol;
@@ -299,7 +297,7 @@ public class QueryClientImpl implements QueryClient {
 
     GetQueryResultResponse response = getResultResponse(queryId);
 
-    TableDesc tableDesc = CatalogUtil.newTableDesc(response.getTableDesc());
+    TableDesc tableDesc = new TableDesc(response.getTableDesc());
     return new FetchResultSet(this, tableDesc.getLogicalSchema(), queryId, defaultFetchRows);
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-client/src/main/java/org/apache/tajo/client/TajoClientUtil.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/TajoClientUtil.java b/tajo-client/src/main/java/org/apache/tajo/client/TajoClientUtil.java
index 2fe67ed..1d0ce10 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/TajoClientUtil.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/TajoClientUtil.java
@@ -77,7 +77,7 @@ public class TajoClientUtil {
   public static ResultSet createResultSet(TajoClient client, QueryId queryId,
                                           ClientProtos.GetQueryResultResponse response, int fetchRows)
       throws IOException {
-    TableDesc desc = CatalogUtil.newTableDesc(response.getTableDesc());
+    TableDesc desc = new TableDesc(response.getTableDesc());
     return new FetchResultSet(client, desc.getLogicalSchema(), queryId, fetchRows);
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 5cc4309..9198a1e 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
@@ -22,7 +22,7 @@ import org.apache.tajo.QueryId;
 import org.apache.tajo.SessionVars;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes;
-import org.apache.tajo.datum.*;
+import org.apache.tajo.datum.TimestampDatum;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.util.datetime.DateTimeUtil;
 import org.apache.tajo.util.datetime.TimeMeta;
@@ -223,10 +223,10 @@ public abstract class TajoResultSetBase implements ResultSet {
       case FLOAT8:  return tuple.getFloat8(index);
       case NUMERIC:  return tuple.getFloat8(index);
       case DATE: {
-        return toDate(tuple.getTimeDate(index), timezone);
+        return toDate(tuple.getTimeDate(index), null);
       }
       case TIME: {
-        return toTime(tuple.getTimeDate(index), timezone);
+        return toTime(tuple.getTimeDate(index), null);
       }
       case TIMESTAMP: {
         return toTimestamp(tuple.getTimeDate(index), timezone);
@@ -268,8 +268,6 @@ public abstract class TajoResultSetBase implements ResultSet {
     switch(tuple.type(index)) {
       case BOOLEAN:
         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 :
@@ -302,10 +300,7 @@ public abstract class TajoResultSetBase implements ResultSet {
   }
 
   private Date toDate(TimeMeta tm, TimeZone tz) {
-    if (tz != null) {
-      DateTimeUtil.toUserTimezone(tm, tz);
-    }
-    return new Date(DateTimeUtil.julianTimeToJavaTime(DateTimeUtil.toJulianTimestamp(tm)));
+    return DateTimeUtil.toJavaDate(tm, tz);
   }
 
   @Override
@@ -333,10 +328,7 @@ public abstract class TajoResultSetBase implements ResultSet {
   }
 
   private Time toTime(TimeMeta tm, TimeZone tz) {
-    if (tz != null) {
-      DateTimeUtil.toUserTimezone(tm, tz);
-    }
-    return new Time(DateTimeUtil.toJavaTime(tm.hours, tm.minutes, tm.secs, tm.fsecs));
+    return DateTimeUtil.toJavaTime(tm, tz);
   }
 
   @Override
@@ -364,10 +356,7 @@ public abstract class TajoResultSetBase implements ResultSet {
   }
 
   private Timestamp toTimestamp(TimeMeta tm, TimeZone tz) {
-    if (tz != null) {
-      DateTimeUtil.toUserTimezone(tm, tz);
-    }
-    return new Timestamp(DateTimeUtil.julianTimeToJavaTime(DateTimeUtil.toJulianTimestamp(tm)));
+    return DateTimeUtil.toJavaTimestamp(tm, tz);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-client/src/main/java/org/apache/tajo/jdbc/WaitingResultSet.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/jdbc/WaitingResultSet.java b/tajo-client/src/main/java/org/apache/tajo/jdbc/WaitingResultSet.java
index c9967b4..eb2d9cb 100644
--- a/tajo-client/src/main/java/org/apache/tajo/jdbc/WaitingResultSet.java
+++ b/tajo-client/src/main/java/org/apache/tajo/jdbc/WaitingResultSet.java
@@ -20,7 +20,6 @@ package org.apache.tajo.jdbc;
 
 import org.apache.tajo.QueryId;
 import org.apache.tajo.TajoProtos;
-import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.client.QueryClient;
@@ -64,7 +63,7 @@ public class WaitingResultSet extends FetchResultSet {
       }
 
       ClientProtos.GetQueryResultResponse response = tajoClient.getResultResponse(queryId);
-      TableDesc tableDesc = CatalogUtil.newTableDesc(response.getTableDesc());
+      TableDesc tableDesc = new TableDesc(response.getTableDesc());
       return tableDesc.getLogicalSchema();
     } catch (TajoException e) {
       throw SQLExceptionUtil.toSQLException(e);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-cluster-tests/src/test/java/org/apache/tajo/BackendTestingUtil.java
----------------------------------------------------------------------
diff --git a/tajo-cluster-tests/src/test/java/org/apache/tajo/BackendTestingUtil.java b/tajo-cluster-tests/src/test/java/org/apache/tajo/BackendTestingUtil.java
index 28605d3..23aebca 100644
--- a/tajo-cluster-tests/src/test/java/org/apache/tajo/BackendTestingUtil.java
+++ b/tajo-cluster-tests/src/test/java/org/apache/tajo/BackendTestingUtil.java
@@ -40,7 +40,7 @@ public class BackendTestingUtil {
         .add("deptname", Type.TEXT)
         .add("score", Type.INT4)
         .build();
-    mockupMeta = CatalogUtil.newTableMeta("TEXT");
+    mockupMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, new TajoConf());
   }
 
   public static void writeTmpTable(TajoConf conf, Path tablePath)

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java
----------------------------------------------------------------------
diff --git a/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java b/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java
index 116990f..aebd7b9 100644
--- a/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java
+++ b/tajo-cluster-tests/src/test/java/org/apache/tajo/QueryTestCaseBase.java
@@ -56,10 +56,7 @@ import org.apache.tajo.plan.verifier.VerificationState;
 import org.apache.tajo.storage.BufferPool;
 import org.apache.tajo.storage.StorageUtil;
 import org.apache.tajo.util.FileUtil;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Rule;
+import org.junit.*;
 import org.junit.rules.TestName;
 import org.junit.rules.TestRule;
 import org.junit.rules.TestWatcher;
@@ -265,6 +262,11 @@ public class QueryTestCaseBase {
         name.getMethodName()));
   }
 
+  @After
+  public void clear() {
+    getClient().unsetSessionVariables(Lists.newArrayList(SessionVars.TIMEZONE.name()));
+  }
+
   public QueryTestCaseBase() {
     // hive 0.12 does not support quoted identifier.
     // So, we use lower case database names when Tajo uses HiveCatalogStore.

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java
----------------------------------------------------------------------
diff --git a/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java b/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java
index b1a3306..5413905 100644
--- a/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java
+++ b/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java
@@ -118,11 +118,6 @@ public class TajoTestingCluster {
 
   void initPropertiesAndConfigs() {
 
-    // Set time zone
-    TimeZone testDefaultTZ = TimeZone.getTimeZone(TajoConstants.DEFAULT_SYSTEM_TIMEZONE);
-    conf.setSystemTimezone(testDefaultTZ);
-    TimeZone.setDefault(testDefaultTZ);
-
     // Injection of equality testing code of logical plan (de)serialization
     conf.setClassVar(ConfVars.LOGICAL_PLAN_REWRITE_RULE_PROVIDER_CLASS, LogicalPlanTestRuleProvider.class);
     conf.setClassVar(ConfVars.GLOBAL_PLAN_REWRITE_RULE_PROVIDER_CLASS, GlobalPlanTestRuleProvider.class);
@@ -546,12 +541,6 @@ public class TajoTestingCluster {
     LOG.info("Minicluster is stopping");
     LOG.info("========================================");
 
-    try {
-      Thread.sleep(3000);
-    } catch (InterruptedException e) {
-      e.printStackTrace();
-    }
-
     shutdownMiniTajoCluster();
 
     if(this.catalogServer != null) {
@@ -560,7 +549,7 @@ public class TajoTestingCluster {
     }
 
     try {
-      Thread.sleep(3000);
+      Thread.sleep(2000);
     } catch (InterruptedException e) {
       e.printStackTrace();
     }
@@ -613,7 +602,7 @@ public class TajoTestingCluster {
     for (int i = 0; i < names.length; i++) {
       createTable(names[i], schemas[i], tableOption, tables[i]);
     }
-    Thread.sleep(1000);
+
     ResultSet res = client.executeQueryAndGetResult(query);
     return res;
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java b/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java
index f431fad..1b60826 100644
--- a/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java
+++ b/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java
@@ -31,9 +31,6 @@ public class TajoConstants {
   public static final String DEFAULT_DATABASE_NAME = "default";
   public static final String DEFAULT_SCHEMA_NAME = "";
 
-  /** Java 6 only recognize GMT instead of UTC. So, we should keep using GMT. */
-  public static final String DEFAULT_SYSTEM_TIMEZONE = "GMT";
-
   public static final String EMPTY_STRING = "";
 
   public static final String SYSTEM_HA_DIR_NAME = "ha";

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
index 440af80..e619b24 100644
--- a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
+++ b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
@@ -46,7 +46,6 @@ import java.util.TimeZone;
 import java.util.concurrent.TimeUnit;
 
 public class TajoConf extends Configuration {
-  private static TimeZone SYSTEM_TIMEZONE;
   private static int DATE_ORDER = -1;
 
   private static final Map<String, ConfVars> vars = new HashMap<>();
@@ -79,7 +78,6 @@ public class TajoConf extends Configuration {
     addResource(path);
   }
 
-  @SuppressWarnings("unused")
   public TimeZone getSystemTimezone() {
     return TimeZone.getTimeZone(getVar(ConfVars.$TIMEZONE));
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 ac84e25..acc5408 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
@@ -102,29 +102,27 @@ public class DateDatum extends Datum {
 
   @Override
   public Datum plus(Datum datum) {
-    switch(datum.type()) {
-      case INT2:
-      case INT4:
-      case INT8:
-      case FLOAT4:
-      case FLOAT8: {
-        TimeMeta tm = asTimeMeta();
-        tm.plusDays(datum.asInt4());
-        return new DateDatum(tm);
-      }
-      case INTERVAL:
-        IntervalDatum interval = (IntervalDatum) datum;
-        TimeMeta tm = asTimeMeta();
-        tm.plusInterval(interval.months, interval.milliseconds);
-        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
-      case TIME: {
-        TimeMeta tm1 = asTimeMeta();
-        TimeMeta tm2 = datum.asTimeMeta();
-        tm1.plusTime(DateTimeUtil.toTime(tm2));
-        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
-      }
-      default:
-        throw new InvalidOperationException(datum.type());
+    switch (datum.type()) {
+    case INT2:
+    case INT4:
+    case INT8: {
+      TimeMeta tm = asTimeMeta();
+      tm.plusDays(datum.asInt4());
+      return new DateDatum(tm);
+    }
+    case INTERVAL:
+      IntervalDatum interval = (IntervalDatum) datum;
+      TimeMeta tm = asTimeMeta();
+      tm.plusInterval(interval.months, interval.milliseconds);
+      return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+    case TIME: {
+      TimeMeta tm1 = asTimeMeta();
+      TimeMeta tm2 = datum.asTimeMeta();
+      tm1.plusTime(DateTimeUtil.toTime(tm2));
+      return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
+    }
+    default:
+      throw new InvalidOperationException("operator does not exist: " + type() + " + " + datum.type());
     }
   }
 
@@ -133,9 +131,7 @@ public class DateDatum extends Datum {
     switch(datum.type()) {
       case INT2:
       case INT4:
-      case INT8:
-      case FLOAT4:
-      case FLOAT8: {
+      case INT8: {
         TimeMeta tm = asTimeMeta();
         tm.plusDays(0 - datum.asInt4());
         return new DateDatum(tm);
@@ -157,7 +153,7 @@ public class DateDatum extends Datum {
         return new Int4Datum(jdate - d.jdate);
       }
       default:
-        throw new InvalidOperationException(datum.type());
+        throw new InvalidOperationException("operator does not exist: " + type() + " - " + datum.type());
     }
   }
 
@@ -207,7 +203,7 @@ public class DateDatum extends Datum {
     } else if (datum.isNull()) {
       return datum;
     } else {
-      throw new InvalidOperationException();
+      throw new InvalidOperationException(datum.type());
     }
   }
 
@@ -216,13 +212,7 @@ public class DateDatum extends Datum {
     if (datum.type() == TajoDataTypes.Type.DATE) {
       DateDatum another = (DateDatum) datum;
       return Ints.compare(jdate, another.jdate);
-    } else if (datum.type() == TajoDataTypes.Type.TIMESTAMP) {
-      TimestampDatum another = (TimestampDatum) datum;
-      TimeMeta myMeta, otherMeta;
-      myMeta = asTimeMeta();
-      otherMeta = another.asTimeMeta();
-      return myMeta.compareTo(otherMeta);
-    } else if (datum instanceof NullDatum || datum.isNull()) {
+    } else if (datum.isNull()) {
       return -1;
     } else {
       throw new InvalidOperationException(datum.type());

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 e2173a8..dc61145 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
@@ -113,7 +113,7 @@ public abstract class Datum implements Comparable<Datum>, GsonObject {
   }
 
   public byte[] asTextBytes() {
-    return asChars().getBytes();
+    return asChars().getBytes(TextDatum.DEFAULT_CHARSET);
   }
 
   public TimeMeta asTimeMeta() {

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 e9ac0c5..aac877b 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
@@ -283,12 +283,6 @@ public class DatumFactory {
     return new TimeDatum(DateTimeUtil.toJulianTime(timeStr));
   }
 
-  public static TimeDatum createTime(String timeStr, TimeZone tz) {
-    TimeMeta tm = DateTimeUtil.decodeDateTime(timeStr);
-    DateTimeUtil.toUTCTimezone(tm, tz);
-    return new TimeDatum(DateTimeUtil.toTime(tm));
-  }
-
   public static TimestampDatum createTimestampDatumWithJavaMillis(long millis) {
     return new TimestampDatum(DateTimeUtil.javaTimeToJulianTime(millis));
   }
@@ -335,7 +329,7 @@ public class DatumFactory {
     }
   }
 
-  public static TimeDatum createTime(Datum datum, @Nullable TimeZone tz) {
+  public static TimeDatum createTime(Datum datum) {
     switch (datum.type()) {
     case INT8:
       return new TimeDatum(datum.asInt8());
@@ -343,9 +337,6 @@ public class DatumFactory {
     case VARCHAR:
     case TEXT:
       TimeMeta tm = DateTimeFormat.parseDateTime(datum.asChars(), "HH24:MI:SS.MS");
-      if (tz != null) {
-        DateTimeUtil.toUTCTimezone(tm, tz);
-      }
       return new TimeDatum(DateTimeUtil.toTime(tm));
     case TIME:
       return (TimeDatum) datum;
@@ -362,6 +353,13 @@ public class DatumFactory {
         return parseTimestamp(datum.asChars(), tz);
       case TIMESTAMP:
         return (TimestampDatum) datum;
+      case DATE: {
+        TimeMeta tm = datum.asTimeMeta();
+        if (tz != null) {
+          DateTimeUtil.toUTCTimezone(tm, tz);
+        }
+        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+      }
       default:
         throw new TajoRuntimeException(new InvalidValueForCastException(datum.type(), Type.TIMESTAMP));
     }
@@ -436,21 +434,13 @@ public class DatumFactory {
             return DatumFactory.createText(timestampDatum.asChars());
           }
         }
-        case TIME: {
-          TimeDatum timeDatum = (TimeDatum)operandDatum;
-          if (tz != null) {
-            return DatumFactory.createText(TimeDatum.asChars(operandDatum.asTimeMeta(), tz, false));
-          } else {
-            return DatumFactory.createText(timeDatum.asChars());
-          }
-        }
         default:
           return DatumFactory.createText(operandDatum.asTextBytes());
       }
     case DATE:
       return DatumFactory.createDate(operandDatum);
     case TIME:
-      return DatumFactory.createTime(operandDatum, tz);
+      return DatumFactory.createTime(operandDatum);
     case TIMESTAMP:
       return DatumFactory.createTimestamp(operandDatum, tz);
     case BLOB:

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 e797b87..44570f3 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
@@ -247,7 +247,7 @@ public class IntervalDatum extends Datum {
         return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
       }
       default:
-        throw new InvalidOperationException(datum.type());
+        throw new InvalidOperationException("operator does not exist: " + type() + " + " + datum.type());
     }
   }
 
@@ -257,7 +257,7 @@ public class IntervalDatum extends Datum {
       IntervalDatum other = (IntervalDatum) datum;
       return new IntervalDatum(months - other.months, milliseconds - other.milliseconds);
     } else {
-      throw new InvalidOperationException(datum.type());
+      throw new InvalidOperationException("operator does not exist: " + type() + " - " + datum.type());
     }
   }
 
@@ -274,7 +274,7 @@ public class IntervalDatum extends Datum {
         double float8Val = datum.asFloat8();
         return createIntervalDatum((double)months * float8Val, (double) milliseconds * float8Val);
       default:
-        throw new InvalidOperationException(datum.type());
+        throw new InvalidOperationException("operator does not exist: " + type() + " * " + datum.type());
     }
   }
 
@@ -297,7 +297,7 @@ public class IntervalDatum extends Datum {
         }
         return createIntervalDatum((double) months / paramValueF8, (double) milliseconds / paramValueF8);
       default:
-        throw new InvalidOperationException(datum.type());
+        throw new InvalidOperationException("operator does not exist: " + type() + " / " + datum.type());
     }
   }
 
@@ -380,6 +380,13 @@ public class IntervalDatum extends Datum {
           sb.append(".").append(df2.format(millisecond));
         }
       }
+    } else {
+      sb.append(prefix)
+          .append(df.format(0))
+          .append(":")
+          .append(df.format(0))
+          .append(":")
+          .append(df.format(0));
     }
   }
 
@@ -406,7 +413,7 @@ public class IntervalDatum extends Datum {
     } else if (datum.isNull()) {
       return datum;
     } else {
-      throw new InvalidOperationException();
+      throw new InvalidOperationException(datum.type());
     }
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 e70d7d5..57196d2 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
@@ -20,16 +20,14 @@ package org.apache.tajo.datum;
 
 import com.google.common.primitives.Longs;
 import org.apache.tajo.common.TajoDataTypes;
-import org.apache.tajo.exception.InvalidValueForCastException;
 import org.apache.tajo.exception.InvalidOperationException;
+import org.apache.tajo.exception.InvalidValueForCastException;
 import org.apache.tajo.exception.TajoRuntimeException;
 import org.apache.tajo.util.Bytes;
 import org.apache.tajo.util.datetime.DateTimeConstants.DateStyle;
 import org.apache.tajo.util.datetime.DateTimeUtil;
 import org.apache.tajo.util.datetime.TimeMeta;
 
-import java.util.TimeZone;
-
 public class TimeDatum extends Datum {
   public static final int SIZE = 8;
   private final long time;
@@ -98,18 +96,6 @@ public class TimeDatum extends Datum {
     return DateTimeUtil.encodeTime(tm, DateStyle.ISO_DATES);
   }
 
-  public static String asChars(TimeMeta tm, TimeZone timeZone, boolean includeTimeZone) {
-    DateTimeUtil.toUserTimezone(tm, timeZone);
-    if (includeTimeZone) {
-      tm.timeZone = timeZone.getRawOffset() / 1000;
-    }
-    return DateTimeUtil.encodeTime(tm, DateStyle.ISO_DATES);
-  }
-
-  public String toString(TimeZone timeZone, boolean includeTimeZone) {
-    return asChars(asTimeMeta(), timeZone, includeTimeZone);
-  }
-
   @Override
   public int size() {
     return SIZE;
@@ -122,20 +108,27 @@ public class TimeDatum extends Datum {
 
   @Override
   public Datum plus(Datum datum) {
-    switch(datum.type()) {
-      case INTERVAL:
-        IntervalDatum interval = ((IntervalDatum)datum);
-        TimeMeta tm = asTimeMeta();
-        tm.plusInterval(interval.months, interval.milliseconds);
-        return new TimeDatum(DateTimeUtil.toTime(tm));
-      case DATE: {
-        DateDatum dateDatum = (DateDatum) datum;
-        TimeMeta dateTm = dateDatum.asTimeMeta();
-        dateTm.plusTime(time);
-        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(dateTm));
-      }
-      default:
-        throw new InvalidOperationException(datum.type());
+    switch (datum.type()) {
+    case INTERVAL: {
+      IntervalDatum interval = ((IntervalDatum) datum);
+      TimeMeta tm = asTimeMeta();
+      tm.plusInterval(interval.months, interval.milliseconds);
+      return new TimeDatum(DateTimeUtil.toTime(tm));
+    }
+    case DATE: {
+      DateDatum dateDatum = (DateDatum) datum;
+      TimeMeta dateTm = dateDatum.asTimeMeta();
+      dateTm.plusTime(time);
+      return new TimestampDatum(DateTimeUtil.toJulianTimestamp(dateTm));
+    }
+    case TIMESTAMP: {
+      TimestampDatum timestampDatum = (TimestampDatum) datum;
+      TimeMeta tm = timestampDatum.asTimeMeta();
+      tm.plusTime(time);
+      return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+    }
+    default:
+      throw new InvalidOperationException("operator does not exist: " + type() + " + " + datum.type());
     }
   }
 
@@ -150,7 +143,7 @@ public class TimeDatum extends Datum {
       case TIME:
         return new IntervalDatum((time - ((TimeDatum)datum).time)/1000);
       default:
-        throw new InvalidOperationException(datum.type());
+        throw new InvalidOperationException("operator does not exist: " + type() + " - " + datum.type());
     }
   }
 
@@ -170,7 +163,7 @@ public class TimeDatum extends Datum {
     if (datum.type() == TajoDataTypes.Type.TIME) {
       TimeDatum another = (TimeDatum)datum;
       return Longs.compare(time, another.time);
-    } else if (datum instanceof NullDatum || datum.isNull()) {
+    } else if (datum.isNull()) {
       return -1;
     } else {
       throw new InvalidOperationException(datum.type());

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 ac30278..782aab4 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
@@ -23,7 +23,6 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.exception.InvalidOperationException;
 import org.apache.tajo.util.Bytes;
 import org.apache.tajo.util.datetime.DateTimeConstants.DateStyle;
-import org.apache.tajo.util.datetime.DateTimeFormat;
 import org.apache.tajo.util.datetime.DateTimeUtil;
 import org.apache.tajo.util.datetime.TimeMeta;
 
@@ -133,7 +132,7 @@ public class TimestampDatum extends Datum {
   public static String asChars(TimeMeta tm, TimeZone timeZone, boolean includeTimeZone) {
     DateTimeUtil.toUserTimezone(tm, timeZone);
     if (includeTimeZone) {
-      tm.timeZone = timeZone.getRawOffset() / 1000;
+      tm.timeZone = tm.getZonedOffset(DateTimeUtil.toJulianTimestamp(tm), timeZone) / 1000;
     }
     return DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES);
   }
@@ -150,13 +149,7 @@ public class TimestampDatum extends Datum {
   @Override
   public String asChars() {
     TimeMeta tm = asTimeMeta();
-    return DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES);
-  }
-
-  public String toChars(String format) {
-    TimeMeta tm = asTimeMeta();
-
-    return DateTimeFormat.to_char(tm, format);
+    return asChars(tm, TimeZone.getDefault(), true);
   }
 
   @Override
@@ -190,11 +183,6 @@ public class TimestampDatum extends Datum {
     if (datum.type() == TajoDataTypes.Type.TIMESTAMP) {
       TimestampDatum another = (TimestampDatum) datum;
       return Longs.compare(timestamp, another.timestamp);
-    } else if (datum.type() == TajoDataTypes.Type.DATE) {
-      TimeMeta myMeta, otherMeta;
-      myMeta = asTimeMeta();
-      otherMeta = datum.asTimeMeta();
-      return myMeta.compareTo(otherMeta);
     } else if (datum.isNull()) {
       return -1;
     } else {
@@ -214,28 +202,39 @@ public class TimestampDatum extends Datum {
 
   @Override
   public Datum plus(Datum datum) {
-    if (datum.type() == TajoDataTypes.Type.INTERVAL) {
-      IntervalDatum interval = (IntervalDatum)datum;
+    switch (datum.type()) {
+    case INTERVAL:
+      IntervalDatum interval = (IntervalDatum) datum;
       TimeMeta tm = asTimeMeta();
       tm.plusInterval(interval.months, interval.milliseconds);
       return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
-    } else {
-      throw new InvalidOperationException(datum.type());
+    case TIME:
+      TimeMeta tm1 = asTimeMeta();
+      TimeMeta tm2 = datum.asTimeMeta();
+      tm1.plusTime(DateTimeUtil.toTime(tm2));
+      return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
+    default:
+      throw new InvalidOperationException("operator does not exist: " + type() + " + " + datum.type());
     }
   }
 
   @Override
   public Datum minus(Datum datum) {
-    switch(datum.type()) {
-      case INTERVAL:
-        IntervalDatum interval = (IntervalDatum)datum;
-        TimeMeta tm = asTimeMeta();
-        tm.plusInterval(-interval.months, -interval.milliseconds);
-        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
-      case TIMESTAMP:
-        return new IntervalDatum((timestamp - ((TimestampDatum)datum).timestamp) / 1000);
-      default:
-        throw new InvalidOperationException(datum.type());
+    switch (datum.type()) {
+    case INTERVAL:
+      IntervalDatum interval = (IntervalDatum) datum;
+      TimeMeta tm = asTimeMeta();
+      tm.plusInterval(-interval.months, -interval.milliseconds);
+      return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+    case TIMESTAMP:
+      return new IntervalDatum((timestamp - ((TimestampDatum) datum).timestamp) / 1000);
+    case TIME:
+      TimeMeta tm1 = asTimeMeta();
+      TimeMeta tm2 = datum.asTimeMeta();
+      tm1.plusTime(0 - DateTimeUtil.toTime(tm2));
+      return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
+    default:
+      throw new InvalidOperationException("operator does not exist: " + type() + " - " + datum.type());
     }
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 5a338d3..0bf58aa 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
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.util.datetime;
 
+import com.google.common.annotations.VisibleForTesting;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.Int8Datum;
 import org.apache.tajo.exception.ValueOutOfRangeException;
@@ -26,6 +27,9 @@ import org.apache.tajo.util.datetime.DateTimeConstants.DateToken;
 import org.apache.tajo.util.datetime.DateTimeConstants.TokenField;
 
 import javax.annotation.Nullable;
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
 import java.util.TimeZone;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -356,6 +360,31 @@ public class DateTimeUtil {
     return toTime(hour, min, sec, fsec)/DateTimeConstants.MSECS_PER_SEC;
   }
 
+  public static Timestamp toJavaTimestamp(TimeMeta tm, @Nullable TimeZone tz) {
+    long javaTime = DateTimeUtil.julianTimeToJavaTime(DateTimeUtil.toJulianTimestamp(tm));
+
+    if (tz != null) {
+      int offset = tz.getOffset(javaTime) - TimeZone.getDefault().getOffset(javaTime);
+      return new Timestamp(javaTime + offset);
+    } else {
+      return new Timestamp(javaTime);
+    }
+  }
+
+  public static Time toJavaTime(TimeMeta tm, @Nullable TimeZone tz) {
+    if (tz != null) {
+      DateTimeUtil.toUserTimezone(tm, tz);
+    }
+    return new Time(tm.hours, tm.minutes, tm.secs);
+  }
+
+  public static Date toJavaDate(TimeMeta tm, @Nullable TimeZone tz) {
+    if (tz != null) {
+      DateTimeUtil.toUserTimezone(tm, tz);
+    }
+    return new Date(tm.years - 1900, tm.monthOfYear - 1 , tm.dayOfMonth);
+  }
+
   /**
    * Calculate julian timestamp.
    * @param years
@@ -1891,7 +1920,7 @@ public class DateTimeUtil {
 
         appendSecondsToEncodeOutput(sb, tm.secs, tm.fsecs, 6, true);
         if (tm.timeZone != 0 && tm.timeZone != Integer.MAX_VALUE) {
-          sb.append(getTimeZoneDisplayTime(tm.timeZone));
+          sb.append(getDisplayTimeZoneOffset(tm.timeZone));
         }
         if (tm.years <= 0) {
           sb.append(" BC");
@@ -1938,7 +1967,7 @@ public class DateTimeUtil {
         sb.append(String.format("%02d:%02d:", tm.hours, tm.minutes));
         appendSecondsToEncodeOutput(sb, tm.secs, tm.fsecs, 6, true);
         if (tm.timeZone != 0 && tm.timeZone != Integer.MAX_VALUE) {
-          sb.append(getTimeZoneDisplayTime(tm.timeZone));
+          sb.append(getDisplayTimeZoneOffset(tm.timeZone));
         }
         break;
     }
@@ -2077,18 +2106,19 @@ public class DateTimeUtil {
   }
 
   public static void toUserTimezone(TimeMeta tm, TimeZone timeZone) {
-    tm.plusMillis(timeZone.getRawOffset());
+    tm.convertToLocalTime(timeZone);
   }
 
   public static void toUTCTimezone(TimeMeta tm, TimeZone timeZone) {
-    tm.plusMillis(0 - timeZone.getRawOffset());
+    tm.convertToUTC(timeZone);
   }
 
-  public static String getTimeZoneDisplayTime(TimeZone timeZone) {
-    return getTimeZoneDisplayTime(timeZone.getRawOffset() / 1000);
+  @VisibleForTesting
+  public static String getDisplayTimeZoneOffset(TimeZone timeZone, boolean dst) {
+    return getDisplayTimeZoneOffset((timeZone.getRawOffset() + (dst ? timeZone.getDSTSavings() : 0)) / 1000);
   }
 
-  public static String getTimeZoneDisplayTime(int totalSecs) {
+  public static String getDisplayTimeZoneOffset(int totalSecs) {
     if (totalSecs == 0) {
       return "";
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/main/java/org/apache/tajo/util/datetime/TimeMeta.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/util/datetime/TimeMeta.java b/tajo-common/src/main/java/org/apache/tajo/util/datetime/TimeMeta.java
index 3349f43..7202def 100644
--- a/tajo-common/src/main/java/org/apache/tajo/util/datetime/TimeMeta.java
+++ b/tajo-common/src/main/java/org/apache/tajo/util/datetime/TimeMeta.java
@@ -20,6 +20,8 @@ package org.apache.tajo.util.datetime;
 
 import org.apache.tajo.util.datetime.DateTimeConstants.DateStyle;
 
+import java.util.TimeZone;
+
 public class TimeMeta implements Comparable<TimeMeta> {
   public int      fsecs;    // 1/1,000,000 secs
   public int			secs;
@@ -130,6 +132,24 @@ public class TimeMeta implements Comparable<TimeMeta> {
     plusTime(millis * 1000);
   }
 
+  public void convertToUTC(TimeZone zone) {
+    long timestamp = DateTimeUtil.toJulianTimestamp(this);
+
+    timestamp -= (getZonedOffset(timestamp, zone) * 1000L);
+    DateTimeUtil.toJulianTimeMeta(timestamp, this);
+  }
+
+  public void convertToLocalTime(TimeZone zone) {
+    long timestamp = DateTimeUtil.toJulianTimestamp(this);
+
+    timestamp += (getZonedOffset(timestamp, zone) * 1000L);
+    DateTimeUtil.toJulianTimeMeta(timestamp, this);
+  }
+
+  public int getZonedOffset(long julianTimestamp, TimeZone zone) {
+    return zone.getOffset(DateTimeUtil.julianTimeToJavaTime(julianTimestamp));
+  }
+
   public void plusTime(long time) {
     long timestamp = DateTimeUtil.toJulianTimestamp(this);
     timestamp += time;

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/test/java/org/apache/tajo/datum/TestDateDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestDateDatum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestDateDatum.java
index 2b787f5..c7014a6 100644
--- a/tajo-common/src/test/java/org/apache/tajo/datum/TestDateDatum.java
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestDateDatum.java
@@ -117,9 +117,5 @@ public class TestDateDatum {
     
     assertThat(theday.compareTo(thedaybefore) > 0, is(true));
     assertThat(thedaybefore.compareTo(theday) > 0, is(false));
-    
-    TimestampDatum timestamp = DatumFactory.createTimestamp("2014-11-12 15:00:00.68");
-    
-    assertThat(timestamp.compareTo(theday) > 0, is(true));
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/test/java/org/apache/tajo/datum/TestIntervalDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestIntervalDatum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestIntervalDatum.java
index 3175c51..b319c9c 100644
--- a/tajo-common/src/test/java/org/apache/tajo/datum/TestIntervalDatum.java
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestIntervalDatum.java
@@ -64,8 +64,7 @@ public class TestIntervalDatum {
 
     // date '2001-09-28' + integer '7'	==> date '2001-10-05'
     Datum datum = DatumFactory.createDate(2001, 9, 28);
-    Datum[] datums = new Datum[]{new Int2Datum((short) 7), new Int4Datum(7), new Int8Datum(7),
-          new Float4Datum(7.0f), new Float8Datum(7.0f)};
+    Datum[] datums = new Datum[]{new Int2Datum((short) 7), new Int4Datum(7), new Int8Datum(7)};
 
     for (int i = 0; i < datums.length; i++) {
       Datum result = datum.plus(datums[i]);
@@ -78,20 +77,20 @@ public class TestIntervalDatum {
     datum = DatumFactory.createDate(2001, 9, 28);
     Datum result = datum.plus(new IntervalDatum(60 * 60 * 1000));
     assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
-    assertEquals("2001-09-28 01:00:00", result.asChars());
+    assertEquals(DatumFactory.parseTimestamp("2001-09-28 01:00:00", null), result);
 
     // interval '1 hour' +  date '2001-09-28'	==> timestamp '2001-09-28 01:00:00'
     datum = new IntervalDatum(60 * 60 * 1000);
     result = datum.plus(DatumFactory.createDate(2001, 9, 28));
     assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
-    assertEquals("2001-09-28 01:00:00", result.asChars());
+    assertEquals(DatumFactory.parseTimestamp("2001-09-28 01:00:00", null), result);
 
     // date '2001-09-28' + time '03:00' ==> timestamp '2001-09-28 03:00:00'
     datum = DatumFactory.createDate(2001, 9, 28);
     TimeDatum time = new TimeDatum(DateTimeUtil.toTime(3, 0, 0, 0));
     result = datum.plus(time);
     assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
-    assertEquals("2001-09-28 03:00:00", result.asChars());
+    assertEquals(DatumFactory.parseTimestamp("2001-09-28 03:00:00", null), result);
 
     // interval '1 day' + interval '1 hour'	interval '1 day 01:00:00'
     datum = new IntervalDatum(IntervalDatum.DAY_MILLIS);
@@ -103,7 +102,7 @@ public class TestIntervalDatum {
     datum = new TimestampDatum(DateTimeUtil.toJulianTimestamp(2001, 9, 28, 1, 0, 0, 0));
     result = datum.plus(new IntervalDatum(23 * 60 * 60 * 1000));
     assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
-    assertEquals("2001-09-29 00:00:00", result.asChars());
+    assertEquals(DatumFactory.parseTimestamp("2001-09-29 00:00:00", null), result);
 
     // time '01:00' + interval '3 hours' ==> time '04:00:00'
     datum = new TimeDatum(DateTimeUtil.toTime(1, 0, 0, 0));
@@ -132,14 +131,14 @@ public class TestIntervalDatum {
     datum = DatumFactory.createDate(2001, 9, 28);
     result = datum.minus(new IntervalDatum(1 * 60 * 60 * 1000));
     assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
-    assertEquals("2001-09-27 23:00:00", result.asChars());
+    assertEquals(DatumFactory.parseTimestamp("2001-09-27 23:00:00", null), result);
 
     // date '2001-09-28' - interval '1 day 1 hour' ==> timestamp '2001-09-26 23:00:00'
     // In this case all datums are UTC
     datum = DatumFactory.createDate(2001, 9, 28);
     result = datum.minus(new IntervalDatum(IntervalDatum.DAY_MILLIS + 1 * 60 * 60 * 1000));
     assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
-    assertEquals("2001-09-26 23:00:00",  result.asChars());
+    assertEquals(DatumFactory.parseTimestamp("2001-09-26 23:00:00", null),  result);
 
     // time '05:00' - time '03:00' ==>	interval '02:00:00'
     datum = new TimeDatum(DateTimeUtil.toTime(5, 0, 0, 0));
@@ -158,7 +157,7 @@ public class TestIntervalDatum {
     datum = new TimestampDatum(DateTimeUtil.toJulianTimestamp(2001, 9, 28, 23, 0, 0, 0));
     result = datum.minus(new IntervalDatum(23 * 60 * 60 * 1000));
     assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
-    assertEquals("2001-09-28 00:00:00", result.asChars());
+    assertEquals(DatumFactory.parseTimestamp("2001-09-28 00:00:00", null), result);
 
     // interval '1 day' - interval '1 hour'	==> interval '1 day -01:00:00'
     datum = new IntervalDatum(IntervalDatum.DAY_MILLIS);
@@ -204,6 +203,6 @@ public class TestIntervalDatum {
     datum = new TimestampDatum(DateTimeUtil.toJulianTimestamp(2001, 8, 31, 1, 0, 0, 0));
     result = datum.plus(new IntervalDatum(1, 0));
     assertEquals(TajoDataTypes.Type.TIMESTAMP, result.type());
-    assertEquals("2001-09-30 01:00:00", result.asChars());
+    assertEquals(DatumFactory.parseTimestamp("2001-09-30 01:00:00", null), result);
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java b/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java
index 457ff41..7058b52 100644
--- a/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java
+++ b/tajo-common/src/test/java/org/apache/tajo/datum/TestTimeDatum.java
@@ -18,8 +18,8 @@
 
 package org.apache.tajo.datum;
 
-import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.common.TajoDataTypes.DataType;
+import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.exception.TajoRuntimeException;
 import org.apache.tajo.json.CommonGsonHelper;
 import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/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 68b34a6..2bbb92d 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
@@ -92,7 +92,7 @@ public class TestTimestampDatum {
   public void testAsText2() {
     // TAJO-1366
     TimestampDatum datum = DatumFactory.createTimestamp("Mon Nov 03 00:03:00 +0000 2014");
-    assertEquals("2014-11-03 00:03:00", datum.asChars());
+    assertEquals("2014-11-03 00:03:00", TimestampDatum.asChars(datum.asTimeMeta(), TimeZone.getTimeZone("+0000"), true));
   }
 
 	@Test
@@ -120,7 +120,7 @@ public class TestTimestampDatum {
   @Test
   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-01 15:20:30", TimestampDatum.asChars(datum.asTimeMeta(), TimeZone.getTimeZone("GMT"), true));
     assertEquals("2014-05-02 00:20:30+09", TimestampDatum.asChars(datum.asTimeMeta(), TimeZone.getTimeZone("GMT+9"), true));
   }
 
@@ -195,10 +195,6 @@ public class TestTimestampDatum {
     
     assertThat(theday.compareTo(thedaybefore) > 0, is(true));
     assertThat(thedaybefore.compareTo(theday) > 0, is(false));
-    
-    DateDatum date = DatumFactory.createDate("2014-11-12");
-    
-    assertThat(theday.compareTo(date) > 0, is(true));
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeUtil.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeUtil.java b/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeUtil.java
index ae4a517..75f3ee7 100644
--- a/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeUtil.java
+++ b/tajo-common/src/test/java/org/apache/tajo/util/TestDateTimeUtil.java
@@ -384,11 +384,13 @@ public class TestDateTimeUtil {
 
   @Test
   public void testGetTimeZoneDisplayTime() {
-    assertEquals("", DateTimeUtil.getTimeZoneDisplayTime(TimeZone.getTimeZone("GMT")));
-    assertEquals("+09", DateTimeUtil.getTimeZoneDisplayTime(TimeZone.getTimeZone("GMT+9")));
-    assertEquals("+09:10", DateTimeUtil.getTimeZoneDisplayTime(TimeZone.getTimeZone("GMT+9:10")));
-    assertEquals("-09", DateTimeUtil.getTimeZoneDisplayTime(TimeZone.getTimeZone("GMT-9")));
-    assertEquals("-09:10", DateTimeUtil.getTimeZoneDisplayTime(TimeZone.getTimeZone("GMT-9:10")));
+    assertEquals("", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("GMT"), false));
+    assertEquals("+09", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("GMT+9"), false));
+    assertEquals("+09:10", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("GMT+9:10"), false));
+    assertEquals("-09", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("GMT-9"), false));
+    assertEquals("-09:10", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("GMT-9:10"), false));
+    assertEquals("-07", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("America/Los_Angeles"), true));
+    assertEquals("-08", DateTimeUtil.getDisplayTimeZoneOffset(TimeZone.getTimeZone("America/Los_Angeles"), false));
   }
   
   @Test

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestDDLBuilder.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestDDLBuilder.java b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestDDLBuilder.java
index 8790a38..4bef226 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestDDLBuilder.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestDDLBuilder.java
@@ -20,14 +20,18 @@ package org.apache.tajo.cli.tools;
 
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.compress.GzipCodec;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.catalog.partition.PartitionMethodDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.storage.StorageConstants;
 import org.apache.tajo.util.JavaResourceUtil;
 import org.junit.Test;
 
+import java.util.TimeZone;
+
 import static org.junit.Assert.*;
 
 
@@ -35,6 +39,7 @@ public class TestDDLBuilder {
   private static final Schema schema1;
   private static final TableMeta meta1;
   private static final PartitionMethodDesc partitionMethod1;
+  private static final TajoConf conf;
 
   static {
     schema1 = SchemaBuilder.builder()
@@ -42,8 +47,9 @@ public class TestDDLBuilder {
         .add("addr", TajoDataTypes.Type.TEXT)
         .build();
 
-    meta1 = CatalogUtil.newTableMeta("TEXT");
-    meta1.putProperty(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
+    conf = new TajoConf();
+    conf.setSystemTimezone(TimeZone.getTimeZone("Asia/Seoul"));
+    meta1 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     meta1.putProperty(StorageConstants.COMPRESSION_CODEC, GzipCodec.class.getName());
 
     Schema expressionSchema = SchemaBuilder.builder()

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestTajoDump.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestTajoDump.java b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestTajoDump.java
index 937b75c..57a6aa3 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestTajoDump.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tools/TestTajoDump.java
@@ -49,7 +49,9 @@ public class TestTajoDump extends QueryTestCaseBase {
         TajoDump.dump(client, userInfo, getCurrentDatabase(), false, false, false, printWriter);
         printWriter.flush();
         printWriter.close();
-        assertStrings(new String(bos.toByteArray()));
+
+        assertOutputResult("testDump1.result", new String(bos.toByteArray()), new String[]{"${table.timezone}"},
+            new String[]{testingCluster.getConfiguration().getSystemTimezone().getID()});
         bos.close();
       } finally {
         executeString("DROP TABLE \"" + getCurrentDatabase() + "\".\"TableName1\"");
@@ -70,7 +72,9 @@ public class TestTajoDump extends QueryTestCaseBase {
         TajoDump.dump(client, userInfo, getCurrentDatabase(), false, false, false, printWriter);
         printWriter.flush();
         printWriter.close();
-        assertStrings(new String(bos.toByteArray()));
+
+        assertOutputResult("testDump2.result", new String(bos.toByteArray()), new String[]{"${table.timezone}"},
+            new String[]{testingCluster.getConfiguration().getSystemTimezone().getID()});
         bos.close();
       } finally {
         executeString("DROP TABLE \"" + getCurrentDatabase() + "\".\"TableName2\"");
@@ -95,8 +99,10 @@ public class TestTajoDump extends QueryTestCaseBase {
         printWriter.flush();
         printWriter.close();
 
-        assertOutputResult("testDump3.result", new String(bos.toByteArray()), new String[]{"${index.path}"},
-          new String[]{TablespaceManager.getDefault().getTableUri(getCurrentDatabase(), "test_idx").toString()});
+        assertOutputResult("testDump3.result", new String(bos.toByteArray()),
+            new String[]{"${index.path}", "${table.timezone}"},
+            new String[]{TablespaceManager.getDefault().getTableUri(getCurrentDatabase(), "test_idx").toString(),
+                testingCluster.getConfiguration().getSystemTimezone().getID()});
         bos.close();
       } finally {
         executeString("DROP INDEX test_idx");
@@ -131,13 +137,12 @@ public class TestTajoDump extends QueryTestCaseBase {
         printWriter.flush();
         printWriter.close();
 
-        String[] paramValues = new String[] {
-          TablespaceManager.getDefault().getTableUri(getCurrentDatabase(), "TableName3").toString()
-          , TablespaceManager.getDefault().getTableUri(getCurrentDatabase(), "TableName4").toString()
-        };
+        assertOutputResult("testPartitionsDump.result", new String(bos.toByteArray()),
+            new String[]{"${partition.path1}", "${partition.path2}", "${table.timezone}"},
+            new String[]{TablespaceManager.getDefault().getTableUri(getCurrentDatabase(), "TableName3").toString(),
+                TablespaceManager.getDefault().getTableUri(getCurrentDatabase(), "TableName4").toString(),
+                testingCluster.getConfiguration().getSystemTimezone().getID()});
 
-        assertOutputResult("testPartitionsDump.result", new String(bos.toByteArray())
-          , new String[]{"${partition.path1}", "${partition.path2}"}, paramValues);
         bos.close();
       } finally {
         executeString("DROP TABLE \"" + getCurrentDatabase() + "\".\"TableName3\"");

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java
index c210a24..c148298 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java
@@ -251,8 +251,9 @@ public class TestTajoCli {
     String consoleResult = new String(out.toByteArray());
 
     if (!cluster.isHiveCatalogStoreRunning()) {
-      assertOutputResult(resultFileName, consoleResult, new String[]{"${table.path}"},
-        new String[]{TablespaceManager.getDefault().getTableUri("default", tableName).toString()});
+      assertOutputResult(resultFileName, consoleResult, new String[]{"${table.timezone}", "${table.path}"},
+          new String[]{cluster.getConfiguration().getSystemTimezone().getID(),
+              TablespaceManager.getDefault().getTableUri("default", tableName).toString()});
     }
   }
 
@@ -485,10 +486,12 @@ public class TestTajoCli {
     tajoCli.executeMetaCommand("\\set TIMEZONE GMT+0");
     tajoCli.executeScript("create table " + tableName + " (col1 TIMESTAMP)");
     tajoCli.executeScript("insert into " + tableName + " select to_timestamp(0)");
+    out.reset();
+
     tajoCli.executeScript("select * from " + tableName);
     String consoleResult = new String(out.toByteArray());
     tajoCli.executeScript("DROP TABLE " + tableName + " PURGE");
-    assertTrue(consoleResult.contains("1970-01-01 00:00:00"));
+    assertEquals("1970-01-01 00:00:00", consoleResult.split("\n")[2]);
   }
 
   @Test
@@ -497,10 +500,12 @@ public class TestTajoCli {
     tajoCli.executeMetaCommand("\\set TIMEZONE GMT+1");
     tajoCli.executeScript("create table " + tableName + " (col1 TIMESTAMP)");
     tajoCli.executeScript("insert into " + tableName + " select to_timestamp(0)");
+    out.reset();
+
     tajoCli.executeScript("select * from " + tableName);
     String consoleResult = new String(out.toByteArray());
     tajoCli.executeScript("DROP TABLE " + tableName + " PURGE");
-    assertTrue(consoleResult.contains("1970-01-01 00:00:00"));
+    assertEquals("1970-01-01 01:00:00", consoleResult.split("\n")[2]);
   }
 
   @Test(timeout = 3000)