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:02 UTC

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

Repository: tajo
Updated Branches:
  refs/heads/master 73ac4b87d -> aad78a4e7


http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/function/stream/TextFieldSerializerDeserializer.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/function/stream/TextFieldSerializerDeserializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/function/stream/TextFieldSerializerDeserializer.java
index 7d03f47..9638634 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/function/stream/TextFieldSerializerDeserializer.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/function/stream/TextFieldSerializerDeserializer.java
@@ -22,16 +22,17 @@ import com.google.protobuf.Message;
 import io.netty.buffer.ByteBuf;
 import io.netty.util.CharsetUtil;
 import org.apache.commons.codec.binary.Base64;
-import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.*;
 import org.apache.tajo.datum.protobuf.ProtobufJsonFormat;
 import org.apache.tajo.exception.TajoRuntimeException;
 import org.apache.tajo.exception.UnsupportedException;
 import org.apache.tajo.exception.ValueTooLongForTypeCharactersException;
 import org.apache.tajo.storage.StorageConstants;
+import org.apache.tajo.util.Bytes;
 import org.apache.tajo.util.NumberUtil;
 
 import java.io.IOException;
@@ -45,12 +46,12 @@ public class TextFieldSerializerDeserializer implements FieldSerializerDeseriali
   private static ProtobufJsonFormat protobufJsonFormat = ProtobufJsonFormat.getInstance();
   private final CharsetDecoder decoder = CharsetUtil.getDecoder(CharsetUtil.UTF_8);
 
-  private final boolean hasTimezone;
-  private final TimeZone timezone;
+  private static final TajoConf TAJO_CONF = new TajoConf();
+  private final TimeZone tableTimezone;
 
   public TextFieldSerializerDeserializer(TableMeta meta) {
-    hasTimezone = meta.containsProperty(StorageConstants.TIMEZONE);
-    timezone = TimeZone.getTimeZone(meta.getProperty(StorageConstants.TIMEZONE, TajoConstants.DEFAULT_SYSTEM_TIMEZONE));
+    tableTimezone = TimeZone.getTimeZone(
+        meta.getProperty(StorageConstants.TIMEZONE, TAJO_CONF.getSystemTimezone().getID()));
   }
 
   private static boolean isNull(ByteBuf val, ByteBuf nullBytes) {
@@ -112,20 +113,13 @@ public class TextFieldSerializerDeserializer implements FieldSerializerDeseriali
         out.write(bytes);
         break;
       case TIME:
-        if (hasTimezone) {
-          bytes = ((TimeDatum) datum).toString(timezone, true).getBytes();
-        } else {
-          bytes = datum.asTextBytes();
-        }
+        bytes = datum.asTextBytes();
         length = bytes.length;
         out.write(bytes);
         break;
       case TIMESTAMP:
-        if (hasTimezone) {
-          bytes = ((TimestampDatum) datum).toString(timezone, true).getBytes();
-        } else {
-          bytes = datum.asTextBytes();
-        }
+        // UTC to table timezone
+        bytes = ((TimestampDatum) datum).toString(tableTimezone, true).getBytes(Bytes.UTF8_CHARSET);
         length = bytes.length;
         out.write(bytes);
         break;
@@ -209,22 +203,13 @@ public class TextFieldSerializerDeserializer implements FieldSerializerDeseriali
               decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString());
           break;
         case TIME:
-          if (hasTimezone) {
-            datum = DatumFactory.createTime(
-                decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString(), timezone);
-          } else {
-            datum = DatumFactory.createTime(
-                decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString());
-          }
+          datum = DatumFactory.createTime(
+              decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString());
           break;
         case TIMESTAMP:
-          if (hasTimezone) {
-            datum = DatumFactory.createTimestamp(
-                decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString(), timezone);
-          } else {
-            datum = DatumFactory.createTimestamp(
-                decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString());
-          }
+          // table timezone to UTC
+          datum = DatumFactory.createTimestamp(
+              decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString(), tableTimezone);
           break;
         case INTERVAL:
           datum = DatumFactory.createInterval(

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeSerializer.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeSerializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeSerializer.java
index 759867f..db5215b 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeSerializer.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/EvalNodeSerializer.java
@@ -120,9 +120,6 @@ public class EvalNodeSerializer
     } else if (unary.getType() == EvalType.CAST) {
       CastEval castEval = (CastEval) unary;
       unaryBuilder.setCastingType(TypeConverter.convert(castEval.getValueType()));
-      if (castEval.hasTimeZone()) {
-        unaryBuilder.setTimezone(castEval.getTimezone().getID());
-      }
     }
 
     // registering itself and building EvalNode

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/ExprsVerifier.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/ExprsVerifier.java b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/ExprsVerifier.java
index 2040ae3..2afef4a 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/ExprsVerifier.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/verifier/ExprsVerifier.java
@@ -163,7 +163,8 @@ public class ExprsVerifier extends BasicEvalNodeVisitor<VerificationState, EvalN
     }
 
     if (leftType == TIME &&
-        (rightType == DATE || rightType == INTERVAL || rightType == TIME)) {
+        (rightType == DATE || rightType == INTERVAL || rightType == TIME ||
+            rightType == TIMESTAMP)) {
       return;
     }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/proto/Plan.proto
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/proto/Plan.proto b/tajo-plan/src/main/proto/Plan.proto
index 0cd0c32..c50429f 100644
--- a/tajo-plan/src/main/proto/Plan.proto
+++ b/tajo-plan/src/main/proto/Plan.proto
@@ -431,7 +431,6 @@ message UnaryEval {
   required int32 child_id = 1;
   optional DataType castingType = 2;
   optional bool negative = 3;
-  optional string timezone = 4;
 }
 
 message BinaryEval {

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/test/java/org/apache/tajo/plan/TestLogicalNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/test/java/org/apache/tajo/plan/TestLogicalNode.java b/tajo-plan/src/test/java/org/apache/tajo/plan/TestLogicalNode.java
index 3e44e3b..4ebb796 100644
--- a/tajo-plan/src/test/java/org/apache/tajo/plan/TestLogicalNode.java
+++ b/tajo-plan/src/test/java/org/apache/tajo/plan/TestLogicalNode.java
@@ -19,11 +19,13 @@
 package org.apache.tajo.plan;
 
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes.Type;
+import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.plan.logical.GroupbyNode;
 import org.apache.tajo.plan.logical.JoinNode;
 import org.apache.tajo.plan.logical.ScanNode;
@@ -36,6 +38,8 @@ public class TestLogicalNode {
 
   @Test
   public void testEquals() {
+    TajoConf conf = new TajoConf();
+
     Schema schema = SchemaBuilder.builder()
         .add("id", Type.INT4)
         .add("name", Type.TEXT)
@@ -44,13 +48,15 @@ public class TestLogicalNode {
     GroupbyNode groupbyNode = new GroupbyNode(0);
     groupbyNode.setGroupingColumns(new Column[]{schema.getColumn(1), schema.getColumn(2)});
     ScanNode scanNode = new ScanNode(0);
-    scanNode.init(CatalogUtil.newTableDesc("in", schema, CatalogUtil.newTableMeta("TEXT"), new Path("in")));
+    scanNode.init(CatalogUtil.newTableDesc("in", schema,
+        CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf), new Path("in")));
 
     GroupbyNode groupbyNode2 = new GroupbyNode(0);
     groupbyNode2.setGroupingColumns(new Column[]{schema.getColumn(1), schema.getColumn(2)});
     JoinNode joinNode = new JoinNode(0);
     ScanNode scanNode2 = new ScanNode(0);
-    scanNode2.init(CatalogUtil.newTableDesc("in2", schema, CatalogUtil.newTableMeta("TEXT"), new Path("in2")));
+    scanNode2.init(CatalogUtil.newTableDesc("in2", schema,
+        CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf), new Path("in2")));
 
     groupbyNode.setChild(scanNode);
     groupbyNode2.setChild(joinNode);
@@ -61,7 +67,8 @@ public class TestLogicalNode {
     assertFalse(groupbyNode.deepEquals(groupbyNode2));
 
     ScanNode scanNode3 = new ScanNode(0);
-    scanNode3.init(CatalogUtil.newTableDesc("in", schema, CatalogUtil.newTableMeta("TEXT"), new Path("in")));
+    scanNode3.init(CatalogUtil.newTableDesc("in", schema,
+        CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf), new Path("in")));
     groupbyNode2.setChild(scanNode3);
 
     assertTrue(groupbyNode.equals(groupbyNode2));

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/StorageUtil.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/StorageUtil.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/StorageUtil.java
index 442519b..263fb05 100644
--- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/StorageUtil.java
+++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/StorageUtil.java
@@ -21,6 +21,7 @@ package org.apache.tajo.storage;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.conf.TajoConf;
 import sun.nio.ch.DirectBuffer;
 
 import java.io.DataInput;
@@ -31,6 +32,8 @@ import java.nio.ByteBuffer;
 
 public class StorageUtil extends StorageConstants {
 
+  public static final TajoConf TAJO_CONF = new TajoConf();
+
   public static Path concatPath(String parent, String...childs) {
     return concatPath(new Path(parent), childs);
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TextSerializerDeserializer.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TextSerializerDeserializer.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TextSerializerDeserializer.java
index 1ec13bc..0bc2168 100644
--- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TextSerializerDeserializer.java
+++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TextSerializerDeserializer.java
@@ -31,7 +31,6 @@ import org.apache.tajo.util.NumberUtil;
 
 import java.io.IOException;
 import java.io.OutputStream;
-import java.util.TimeZone;
 
 // Compatibility with Apache Hive
 @Deprecated
@@ -101,12 +100,7 @@ public class TextSerializerDeserializer implements SerializerDeserializer {
         out.write(bytes);
         break;
       case TIME:
-        bytes = TimeDatum.asChars(tuple.getTimeDate(index), TimeZone.getDefault(), true).getBytes();
-        length = bytes.length;
-        out.write(bytes);
-        break;
-      case TIMESTAMP:
-        bytes = TimestampDatum.asChars(tuple.getTimeDate(index), TimeZone.getDefault(), true).getBytes();
+        bytes = tuple.getTextBytes(index);
         length = bytes.length;
         out.write(bytes);
         break;
@@ -185,10 +179,6 @@ public class TextSerializerDeserializer implements SerializerDeserializer {
         datum = isNull(bytes, offset, length, nullCharacters) ? NullDatum.get()
             : DatumFactory.createTime(new String(bytes, offset, length));
         break;
-      case TIMESTAMP:
-        datum = isNull(bytes, offset, length, nullCharacters) ? NullDatum.get()
-            : DatumFactory.createTimestamp(new String(bytes, offset, length));
-        break;
       case INTERVAL:
         datum = isNull(bytes, offset, length, nullCharacters) ? NullDatum.get()
             : DatumFactory.createInterval(new String(bytes, offset, length));

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineDeserializer.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineDeserializer.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineDeserializer.java
index 335f12b..5e35239 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineDeserializer.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineDeserializer.java
@@ -26,7 +26,6 @@ import net.minidev.json.JSONObject;
 import net.minidev.json.parser.JSONParser;
 import net.minidev.json.parser.ParseException;
 import org.apache.commons.net.util.Base64;
-import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.DatumFactory;
@@ -34,6 +33,7 @@ import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.exception.NotImplementedException;
 import org.apache.tajo.exception.TajoRuntimeException;
 import org.apache.tajo.storage.StorageConstants;
+import org.apache.tajo.storage.StorageUtil;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.storage.text.TextLineDeserializer;
 import org.apache.tajo.storage.text.TextLineParsingError;
@@ -51,7 +51,6 @@ public class JsonLineDeserializer extends TextLineDeserializer {
   private final String [] projectedPaths;
   private final CharsetDecoder decoder = CharsetUtil.getDecoder(CharsetUtil.UTF_8);
 
-  private final boolean hasTimezone;
   private final TimeZone timezone;
 
   public JsonLineDeserializer(Schema schema, TableMeta meta, Column [] projected) {
@@ -60,8 +59,8 @@ public class JsonLineDeserializer extends TextLineDeserializer {
     projectedPaths = SchemaUtil.convertColumnsToPaths(Lists.newArrayList(projected), true);
     types = SchemaUtil.buildTypeMap(schema.getAllColumns(), projectedPaths);
 
-    hasTimezone = meta.containsProperty(StorageConstants.TIMEZONE);
-    timezone = TimeZone.getTimeZone(meta.getProperty(StorageConstants.TIMEZONE, TajoConstants.DEFAULT_SYSTEM_TIMEZONE));
+    timezone = TimeZone.getTimeZone(meta.getProperty(StorageConstants.TIMEZONE,
+        StorageUtil.TAJO_CONF.getSystemTimezone().getID()));
   }
 
   @Override
@@ -160,11 +159,7 @@ public class JsonLineDeserializer extends TextLineDeserializer {
     case TIMESTAMP:
       String timestampStr = object.getAsString(fieldName);
       if (timestampStr != null) {
-        if (hasTimezone) {
-          output.put(fieldIndex, DatumFactory.createTimestamp(timestampStr, timezone));
-        } else {
-          output.put(fieldIndex, DatumFactory.createTimestamp(timestampStr));
-        }
+        output.put(fieldIndex, DatumFactory.createTimestamp(timestampStr, timezone));
       } else {
         output.put(fieldIndex, NullDatum.get());
       }
@@ -172,11 +167,7 @@ public class JsonLineDeserializer extends TextLineDeserializer {
     case TIME:
       String timeStr = object.getAsString(fieldName);
       if (timeStr != null) {
-        if (hasTimezone) {
-          output.put(fieldIndex, DatumFactory.createTime(timeStr, timezone));
-        } else {
-          output.put(fieldIndex, DatumFactory.createTime(timeStr));
-        }
+        output.put(fieldIndex, DatumFactory.createTime(timeStr));
       } else {
         output.put(fieldIndex, NullDatum.get());
       }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineSerializer.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineSerializer.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineSerializer.java
index 1885c80..9d14573 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineSerializer.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/json/JsonLineSerializer.java
@@ -21,18 +21,17 @@ package org.apache.tajo.storage.json;
 
 import net.minidev.json.JSONObject;
 import org.apache.commons.net.util.Base64;
-import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.NestedPathUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SchemaUtil;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.TextDatum;
-import org.apache.tajo.datum.TimeDatum;
 import org.apache.tajo.datum.TimestampDatum;
 import org.apache.tajo.exception.NotImplementedException;
 import org.apache.tajo.exception.TajoRuntimeException;
 import org.apache.tajo.storage.StorageConstants;
+import org.apache.tajo.storage.StorageUtil;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.storage.text.TextLineSerializer;
 
@@ -46,7 +45,6 @@ public class JsonLineSerializer extends TextLineSerializer {
   private final Map<String, Type> types;
   private final String [] projectedPaths;
 
-  private final boolean hasTimezone;
   private final TimeZone timezone;
 
   public JsonLineSerializer(Schema schema, TableMeta meta) {
@@ -55,8 +53,8 @@ public class JsonLineSerializer extends TextLineSerializer {
     projectedPaths = SchemaUtil.convertColumnsToPaths(schema.getAllColumns(), true);
     types = SchemaUtil.buildTypeMap(schema.getAllColumns(), projectedPaths);
 
-    hasTimezone = meta.containsProperty(StorageConstants.TIMEZONE);
-    timezone = TimeZone.getTimeZone(meta.getProperty(StorageConstants.TIMEZONE, TajoConstants.DEFAULT_SYSTEM_TIMEZONE));
+    timezone = TimeZone.getTimeZone(meta.getProperty(StorageConstants.TIMEZONE,
+        StorageUtil.TAJO_CONF.getSystemTimezone().getID()));
   }
 
   @Override
@@ -116,18 +114,10 @@ public class JsonLineSerializer extends TextLineSerializer {
       break;
 
     case TIMESTAMP:
-      if (hasTimezone) {
-        json.put(fieldName, TimestampDatum.asChars(input.getTimeDate(fieldIndex), timezone, false));
-      } else {
-        json.put(fieldName, input.asDatum(fieldIndex).asChars());
-      }
+      json.put(fieldName, TimestampDatum.asChars(input.getTimeDate(fieldIndex), timezone, false));
       break;
     case TIME:
-      if (hasTimezone) {
-        json.put(fieldName, TimeDatum.asChars(input.getTimeDate(fieldIndex), timezone, false));
-      } else {
-        json.put(fieldName, input.asDatum(fieldIndex).asChars());
-      }
+      json.put(fieldName, input.asDatum(fieldIndex).asChars());
       break;
 
     case BIT:

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/orc/ORCAppender.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/orc/ORCAppender.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/orc/ORCAppender.java
index b27c640..d8f320f 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/orc/ORCAppender.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/orc/ORCAppender.java
@@ -23,15 +23,11 @@ import org.apache.hadoop.fs.Path;
 import org.apache.orc.CompressionKind;
 import org.apache.orc.OrcConf;
 import org.apache.orc.TypeDescription;
-import org.apache.tajo.TajoConstants;
 import org.apache.tajo.TaskAttemptId;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.statistics.TableStats;
-import org.apache.tajo.storage.FileAppender;
-import org.apache.tajo.storage.StorageConstants;
-import org.apache.tajo.storage.TableStatistics;
-import org.apache.tajo.storage.Tuple;
+import org.apache.tajo.storage.*;
 import org.apache.tajo.storage.thirdparty.orc.OrcFile;
 import org.apache.tajo.storage.thirdparty.orc.OrcFile.EncodingStrategy;
 import org.apache.tajo.storage.thirdparty.orc.OrcUtils;
@@ -49,14 +45,13 @@ public class ORCAppender extends FileAppender {
   public ORCAppender(Configuration conf, TaskAttemptId taskAttemptId, Schema schema,
                      TableMeta meta, Path workDir) {
     super(conf, taskAttemptId, schema, meta, workDir);
-
-    timezone = meta.containsProperty(StorageConstants.TIMEZONE) ?
-        TimeZone.getTimeZone(meta.getProperty(StorageConstants.TIMEZONE)) :
-        TimeZone.getDefault();
   }
 
   @Override
   public void init() throws IOException {
+    timezone = TimeZone.getTimeZone(meta.getProperty(StorageConstants.TIMEZONE,
+        StorageUtil.TAJO_CONF.getSystemTimezone().getID()));
+
     writer = OrcFile.createWriter(path, buildWriterOptions(conf, meta, schema), timezone);
 
     if (tableStatsEnabled) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/orc/OrcScanner.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/orc/OrcScanner.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/orc/OrcScanner.java
index c8aa67b..1329955 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/orc/OrcScanner.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/orc/OrcScanner.java
@@ -31,12 +31,12 @@ import org.apache.orc.*;
 import org.apache.orc.Reader.Options;
 import org.apache.orc.impl.BufferChunk;
 import org.apache.orc.impl.InStream;
-import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.plan.expr.EvalNode;
 import org.apache.tajo.storage.FileScanner;
 import org.apache.tajo.storage.StorageConstants;
+import org.apache.tajo.storage.StorageUtil;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.storage.fragment.Fragment;
 import org.apache.tajo.storage.thirdparty.orc.OrcRecordReader;
@@ -67,6 +67,7 @@ public class OrcScanner extends FileScanner {
   private List<StripeInformation> stripes;
   protected int rowIndexStride;
   private long contentLength, numberOfRows;
+  private TimeZone timeZone;
 
   private List<Integer> versionList;
 
@@ -236,7 +237,7 @@ public class OrcScanner extends FileScanner {
   public OrcRecordReader createRecordReader() throws IOException {
     return new OrcRecordReader(this.stripes, fileSystem, schema, targets, fragment, types, codec, bufferSize,
         rowIndexStride, buildReaderOptions(meta), conf,
-        TimeZone.getTimeZone(meta.getProperty(StorageConstants.TIMEZONE, TajoConstants.DEFAULT_SYSTEM_TIMEZONE)));
+        timeZone);
   }
 
   private static Options buildReaderOptions(TableMeta meta) {
@@ -272,7 +273,9 @@ public class OrcScanner extends FileScanner {
     this.versionList = footerMetaData.versionList;
     this.stripes = convertProtoStripesToStripes(rInfo.footer.getStripesList());
 
-    recordReader = createRecordReader();
+    this.timeZone = TimeZone.getTimeZone(meta.getProperty(StorageConstants.TIMEZONE,
+        StorageUtil.TAJO_CONF.getSystemTimezone().getID()));
+    this.recordReader = createRecordReader();
 
     super.init();
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/TextFieldSerializerDeserializer.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/TextFieldSerializerDeserializer.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/TextFieldSerializerDeserializer.java
index 53b6bcd..f1600c0 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/TextFieldSerializerDeserializer.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/text/TextFieldSerializerDeserializer.java
@@ -20,9 +20,9 @@ package org.apache.tajo.storage.text;
 
 import com.google.protobuf.Message;
 import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufUtil;
 import io.netty.util.CharsetUtil;
 import org.apache.commons.codec.binary.Base64;
-import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableMeta;
@@ -32,6 +32,7 @@ import org.apache.tajo.datum.protobuf.ProtobufJsonFormat;
 import org.apache.tajo.exception.ValueTooLongForTypeCharactersException;
 import org.apache.tajo.storage.FieldSerializerDeserializer;
 import org.apache.tajo.storage.StorageConstants;
+import org.apache.tajo.storage.StorageUtil;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.util.Bytes;
 import org.apache.tajo.util.NumberUtil;
@@ -47,14 +48,13 @@ public class TextFieldSerializerDeserializer implements FieldSerializerDeseriali
   private static ProtobufJsonFormat protobufJsonFormat = ProtobufJsonFormat.getInstance();
   private final CharsetDecoder decoder = CharsetUtil.getDecoder(CharsetUtil.UTF_8);
 
-  private final boolean hasTimezone;
-  private final TimeZone timezone;
+  private final TimeZone tableTimezone;
 
   private Schema schema;
 
   public TextFieldSerializerDeserializer(TableMeta meta) {
-    hasTimezone = meta.containsProperty(StorageConstants.TIMEZONE);
-    timezone = TimeZone.getTimeZone(meta.getProperty(StorageConstants.TIMEZONE, TajoConstants.DEFAULT_SYSTEM_TIMEZONE));
+    tableTimezone = TimeZone.getTimeZone(meta.getProperty(StorageConstants.TIMEZONE,
+        StorageUtil.TAJO_CONF.getSystemTimezone().getID()));
   }
 
   private static boolean isNull(ByteBuf val, ByteBuf nullBytes) {
@@ -62,7 +62,7 @@ public class TextFieldSerializerDeserializer implements FieldSerializerDeseriali
   }
 
   private static boolean isNullText(ByteBuf val, ByteBuf nullBytes) {
-    return val.readableBytes() > 0 && nullBytes.equals(val);
+    return val.readableBytes() > 0 && ByteBufUtil.equals(nullBytes, val);
   }
 
   @Override
@@ -123,20 +123,15 @@ public class TextFieldSerializerDeserializer implements FieldSerializerDeseriali
         out.write(bytes);
         break;
       case TIME:
-        if (hasTimezone) {
-          bytes = TimeDatum.asChars(tuple.getTimeDate(columnIndex), timezone, false).getBytes(Bytes.UTF8_CHARSET);
-        } else {
-          bytes = tuple.getTextBytes(columnIndex);
-        }
+        bytes = tuple.getTextBytes(columnIndex);
         length = bytes.length;
         out.write(bytes);
         break;
       case TIMESTAMP:
-        if (hasTimezone) {
-          bytes = TimestampDatum.asChars(tuple.getTimeDate(columnIndex), timezone, false).getBytes(Bytes.UTF8_CHARSET);
-        } else {
-          bytes = tuple.getTextBytes(columnIndex);
-        }
+        // UTC to table timezone
+        bytes = TimestampDatum.asChars(
+            tuple.getTimeDate(columnIndex), tableTimezone, false).getBytes(Bytes.UTF8_CHARSET);
+
         length = bytes.length;
         out.write(bytes);
         break;
@@ -216,22 +211,13 @@ public class TextFieldSerializerDeserializer implements FieldSerializerDeseriali
               decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString());
           break;
         case TIME:
-          if (hasTimezone) {
-            datum = DatumFactory.createTime(
-                decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString(), timezone);
-          } else {
-            datum = DatumFactory.createTime(
-                decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString());
-          }
+          datum = DatumFactory.createTime(
+              decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString());
           break;
         case TIMESTAMP:
-          if (hasTimezone) {
-            datum = DatumFactory.createTimestamp(
-                decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString(), timezone);
-          } else {
-            datum = DatumFactory.createTimestamp(
-                decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString());
-          }
+          // Convert to UTC by table timezone
+          datum = DatumFactory.createTimestamp(
+              decoder.decode(buf.nioBuffer(buf.readerIndex(), buf.readableBytes())).toString(), tableTimezone);
           break;
         case INTERVAL:
           datum = DatumFactory.createInterval(

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/TreeReaderFactory.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/TreeReaderFactory.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/TreeReaderFactory.java
index 6ab630a..81c7f06 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/TreeReaderFactory.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/TreeReaderFactory.java
@@ -37,7 +37,6 @@ import org.apache.tajo.util.datetime.DateTimeUtil;
 import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
-import java.sql.Timestamp;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.HashMap;
@@ -753,7 +752,6 @@ public class TreeReaderFactory {
     private final TimeZone readerTimeZone;
     private TimeZone writerTimeZone;
     private boolean hasSameTZRules;
-    private final TimeZone timeZone;
 
     TimestampTreeReader(TimeZone timeZone, int columnId, boolean skipCorrupt) throws IOException {
       this(timeZone, columnId, null, null, null, null, skipCorrupt);
@@ -765,8 +763,8 @@ public class TreeReaderFactory {
       super(columnId, presentStream);
       this.skipCorrupt = skipCorrupt;
       this.baseTimestampMap = new HashMap<>();
-      this.readerTimeZone = TimeZone.getDefault();
-      this.writerTimeZone = readerTimeZone;
+      this.readerTimeZone = timeZone;
+      this.writerTimeZone = TimeZone.getDefault();
       this.hasSameTZRules = writerTimeZone.hasSameRules(readerTimeZone);
       this.base_timestamp = getBaseTimestamp(readerTimeZone.getID());
       if (encoding != null) {
@@ -780,7 +778,6 @@ public class TreeReaderFactory {
           this.nanos = createIntegerReader(encoding.getKind(), nanosStream, false, skipCorrupt);
         }
       }
-      this.timeZone = timeZone;
     }
 
     @Override
@@ -803,7 +800,7 @@ public class TreeReaderFactory {
       nanos = createIntegerReader(stripeFooter.getColumnsList().get(columnId).getKind(),
           streams.get(new org.apache.orc.impl.StreamName(columnId,
               OrcProto.Stream.Kind.SECONDARY)), false, skipCorrupt);
-      getBaseTimestamp(stripeFooter.getWriterTimezone());
+      base_timestamp = getBaseTimestamp(stripeFooter.getWriterTimezone());
     }
 
     private long getBaseTimestamp(String timeZoneId) throws IOException {
@@ -849,8 +846,7 @@ public class TreeReaderFactory {
 
       if (valuePresent) {
         long millis = decodeTimestamp(data.next(), nanos.next(), base_timestamp);
-        long adjustedMillis = millis - writerTimeZone.getRawOffset();
-        return DatumFactory.createTimestamp(DateTimeUtil.javaTimeToJulianTime(adjustedMillis));
+        return DatumFactory.createTimestamp(DateTimeUtil.javaTimeToJulianTime(millis));
       } else {
         return NullDatum.get();
       }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/WriterImpl.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/WriterImpl.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/WriterImpl.java
index e0ad3d7..12a155b 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/WriterImpl.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/WriterImpl.java
@@ -50,6 +50,8 @@ import java.io.OutputStream;
 import java.lang.management.ManagementFactory;
 import java.nio.ByteBuffer;
 import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 import static com.google.common.base.Preconditions.checkArgument;
@@ -1459,10 +1461,17 @@ public class WriterImpl implements Writer, MemoryManager.Callback {
       this.nanos = createIntegerWriter(writer.createStream(id,
           OrcProto.Stream.Kind.SECONDARY), false, isDirectV2, writer);
       recordPosition(rowIndexPosition);
-      // for unit tests to set different time zones
-      this.base_timestamp = Timestamp.valueOf(BASE_TIMESTAMP_STRING).getTime() / DateTimeConstants.MSECS_PER_SEC;
       writer.useWriterTimeZone(true);
       timeZone = writer.getTimeZone();
+
+      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+      sdf.setTimeZone(timeZone);
+
+      try {
+        this.base_timestamp = sdf.parse(BASE_TIMESTAMP_STRING).getTime() / DateTimeConstants.MSECS_PER_SEC;
+      } catch (ParseException e) {
+        throw new IOException("Unable to create base timestamp", e);
+      }
     }
 
     @Override
@@ -1480,11 +1489,8 @@ public class WriterImpl implements Writer, MemoryManager.Callback {
       super.write(datum);
       if (datum != null && datum.isNotNull()) {
         long javaTimestamp = DateTimeUtil.julianTimeToJavaTime(datum.asInt8());
-
-        // revise timestamp value depends on timezone
-        javaTimestamp += timeZone.getRawOffset();
-
         Timestamp val = new Timestamp(javaTimestamp);
+
         indexStatistics.updateTimestamp(val);
         seconds.write((val.getTime() / DateTimeConstants.MSECS_PER_SEC) - base_timestamp);
         nanos.write(formatNanos(val.getNanos()));

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestCompressionStorages.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestCompressionStorages.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestCompressionStorages.java
index e9e6608..82bdf8c 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestCompressionStorages.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestCompressionStorages.java
@@ -120,7 +120,7 @@ public class TestCompressionStorages {
         .add("name", Type.TEXT)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     meta.putProperty("compression.codec", codec.getCanonicalName());
     meta.putProperty("compression.type", SequenceFile.CompressionType.BLOCK.name());
     meta.putProperty("rcfile.serde", TextSerializerDeserializer.class.getName());

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestDelimitedTextFile.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestDelimitedTextFile.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestDelimitedTextFile.java
index 29d8197..0c8695c 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestDelimitedTextFile.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestDelimitedTextFile.java
@@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SchemaBuilder;
@@ -42,6 +43,7 @@ import static org.junit.Assert.*;
 public class TestDelimitedTextFile {
   private static final Log LOG = LogFactory.getLog(TestDelimitedTextFile.class);
 
+  private static TajoConf conf = new TajoConf();
   private static Schema schema;
 
   private static Tuple baseTuple;
@@ -89,7 +91,7 @@ public class TestDelimitedTextFile {
 
   @Test
   public void testStripQuote() throws IOException, CloneNotSupportedException {
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     meta.putProperty(StorageUtil.TEXT_DELIMITER, ",");
     meta.putProperty(StorageUtil.QUOTE_CHAR, "\"");
     FileFragment fragment =  getFileFragment("testStripQuote.txt");
@@ -108,7 +110,7 @@ public class TestDelimitedTextFile {
 
   @Test
   public void testIncompleteQuote() throws IOException, CloneNotSupportedException {
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     meta.putProperty(StorageUtil.TEXT_DELIMITER, ",");
     meta.putProperty(StorageUtil.QUOTE_CHAR, "\"");
     FileFragment fragment =  getFileFragment("testIncompleteQuote.txt");
@@ -127,7 +129,7 @@ public class TestDelimitedTextFile {
 
   @Test
   public void testIgnoreAllErrors() throws IOException {
-    TableMeta meta = CatalogUtil.newTableMeta("JSON");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.JSON, conf);;
     meta.putProperty(StorageUtil.TEXT_ERROR_TOLERANCE_MAXNUM, "-1");
     FileFragment fragment =  getFileFragment("testErrorTolerance1.json");
     Scanner scanner =  TablespaceManager.getLocalFs().getScanner(meta, schema, fragment, null);
@@ -145,7 +147,7 @@ public class TestDelimitedTextFile {
 
   @Test
   public void testIgnoreOneErrorTolerance() throws IOException {
-    TableMeta meta = CatalogUtil.newTableMeta("JSON");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.JSON, conf);;
     meta.putProperty(StorageUtil.TEXT_ERROR_TOLERANCE_MAXNUM, "1");
     FileFragment fragment =  getFileFragment("testErrorTolerance1.json");
     Scanner scanner =  TablespaceManager.getLocalFs().getScanner(meta, schema, fragment, null);
@@ -166,7 +168,7 @@ public class TestDelimitedTextFile {
 
   @Test
   public void testNoErrorTolerance() throws IOException {
-    TableMeta meta = CatalogUtil.newTableMeta("JSON");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.JSON, conf);;
     meta.putProperty(StorageUtil.TEXT_ERROR_TOLERANCE_MAXNUM, "0");
     FileFragment fragment =  getFileFragment("testErrorTolerance2.json");
     Scanner scanner =  TablespaceManager.getLocalFs().getScanner(meta, schema, fragment, null);
@@ -185,7 +187,7 @@ public class TestDelimitedTextFile {
   @Test
   public void testIgnoreTruncatedValueErrorTolerance() throws IOException {
     TajoConf conf = new TajoConf();
-    TableMeta meta = CatalogUtil.newTableMeta("JSON");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.JSON, conf);;
     meta.putProperty(StorageUtil.TEXT_ERROR_TOLERANCE_MAXNUM, "1");
     FileFragment fragment = getFileFragment("testErrorTolerance3.json");
     Scanner scanner = TablespaceManager.getLocalFs().getScanner(meta, schema, fragment, null);
@@ -201,7 +203,7 @@ public class TestDelimitedTextFile {
 
   @Test
   public void testSkippingHeaderWithJson() throws IOException {
-    TableMeta meta = CatalogUtil.newTableMeta("JSON");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.JSON, conf);;
     meta.putProperty(StorageConstants.TEXT_SKIP_HEADER_LINE, "2");
     FileFragment fragment = getFileFragment("testNormal.json");
     Scanner scanner = TablespaceManager.getLocalFs().getScanner(meta, schema, fragment, null);
@@ -227,7 +229,7 @@ public class TestDelimitedTextFile {
 
   @Test
   public void testSkippingHeaderWithText() throws IOException {
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     meta.putProperty(StorageConstants.TEXT_SKIP_HEADER_LINE, "1");
     meta.putProperty(StorageConstants.TEXT_DELIMITER, ",");
     FileFragment fragment = getFileFragment("testSkip.txt");

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileSystems.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileSystems.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileSystems.java
index 48740fb..c62a01c 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileSystems.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileSystems.java
@@ -22,6 +22,7 @@ import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.LocalFileSystem;
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SchemaBuilder;
@@ -104,7 +105,7 @@ public class TestFileSystems {
         .add("name", Type.TEXT)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
 
     Tuple[] tuples = new Tuple[4];
     for (int i = 0; i < tuples.length; i++) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileTablespace.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileTablespace.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileTablespace.java
index 65453dd..dc8781e 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileTablespace.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileTablespace.java
@@ -88,7 +88,7 @@ public class TestFileTablespace {
         .add("name", Type.TEXT)
         .build();
 
-		TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT);
+		TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
 		
 		VTuple[] tuples = new VTuple[4];
 		for(int i=0; i < tuples.length; i++) {
@@ -151,7 +151,8 @@ public class TestFileTablespace {
           .add("age", Type.INT4)
           .add("name", Type.TEXT)
           .build();
-      TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT);
+
+      TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
 
       List<Fragment> splits = Lists.newArrayList();
       // Get FileFragments in partition batch
@@ -206,7 +207,8 @@ public class TestFileTablespace {
           .add("age", Type.INT4)
           .add("name", Type.TEXT)
           .build();
-      TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT);
+
+      TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
 
       List<Fragment> splits = Lists.newArrayList();
       // Get FileFragments in partition batch
@@ -250,7 +252,8 @@ public class TestFileTablespace {
           .add("age", Type.INT4)
           .add("name", Type.TEXT)
           .build();
-      TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT);
+
+      TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
 
       List<Fragment> splits = Lists.newArrayList();
       splits.addAll(sm.getSplits("data", meta, schema, tablePath));

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestLineReader.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestLineReader.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestLineReader.java
index b72c98a..541e12d 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestLineReader.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestLineReader.java
@@ -25,6 +25,7 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.IOUtils;
 import org.apache.hadoop.io.compress.DeflateCodec;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SchemaBuilder;
@@ -66,7 +67,7 @@ public class TestLineReader {
         .add("comment2", Type.TEXT)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     Path tablePath = new Path(testDir, "line.data");
     FileAppender appender = (FileAppender) TablespaceManager.getLocalFs().getAppender(
         null, null, meta, schema, tablePath);
@@ -119,7 +120,7 @@ public class TestLineReader {
         .add("comment2", Type.TEXT)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     meta.putProperty("compression.codec", DeflateCodec.class.getCanonicalName());
 
     Path tablePath = new Path(testDir, "testLineDelimitedReaderWithCompression." + DeflateCodec.class.getSimpleName());
@@ -179,7 +180,7 @@ public class TestLineReader {
         .add("comment2", Type.TEXT)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
 
     Path tablePath = new Path(testDir, "testLineDelimitedReader");
     FileAppender appender = (FileAppender) TablespaceManager.getLocalFs().getAppender(
@@ -286,7 +287,7 @@ public class TestLineReader {
         .add("comment2", Type.TEXT)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     Path tablePath = new Path(testDir, "testSeekableByteBufLineReader.data");
     FileAppender appender = (FileAppender) TablespaceManager.getLocalFs().getAppender(
         null, null, meta, schema, tablePath);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestMergeScanner.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestMergeScanner.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestMergeScanner.java
index eae8e15..a99dd3c 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestMergeScanner.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestMergeScanner.java
@@ -33,7 +33,6 @@ import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.storage.fragment.FileFragment;
 import org.apache.tajo.storage.fragment.Fragment;
 import org.apache.tajo.util.CommonTestingUtil;
-import org.apache.tajo.util.KeyValueSet;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -106,9 +105,8 @@ public class TestMergeScanner {
         .add("age", Type.INT8)
         .build();
 
-    KeyValueSet options = new KeyValueSet();
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
-    meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
+
     if (dataFormat.equalsIgnoreCase("AVRO")) {
       meta.putProperty(StorageConstants.AVRO_SCHEMA_LITERAL, TEST_MULTIPLE_FILES_AVRO_SCHEMA);
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestStorages.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestStorages.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestStorages.java
index bcbb6c3..bee692f 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestStorages.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestStorages.java
@@ -48,7 +48,6 @@ import org.apache.tajo.storage.rcfile.RCFile;
 import org.apache.tajo.storage.sequencefile.SequenceFileScanner;
 import org.apache.tajo.util.CommonTestingUtil;
 import org.apache.tajo.util.JavaResourceUtil;
-import org.apache.tajo.util.KeyValueSet;
 import org.junit.After;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -192,7 +191,7 @@ public class TestStorages {
           .add("age", Type.INT8)
           .build();
 
-      TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
+      TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
       Path tablePath = new Path(testDir, "Splitable.data");
       FileTablespace sm = TablespaceManager.getLocalFs();
       Appender appender = sm.getAppender(meta, schema, tablePath);
@@ -248,8 +247,7 @@ public class TestStorages {
         .add("score", Type.FLOAT4)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
-    meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     if (dataFormat.equalsIgnoreCase(BuiltinStorages.AVRO)) {
       meta.putProperty(StorageConstants.AVRO_SCHEMA_LITERAL,
           TEST_PROJECTION_AVRO_SCHEMA);
@@ -292,7 +290,7 @@ public class TestStorages {
           .add("age", Type.INT8)
           .build();
 
-      TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
+      TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
       Path tablePath = new Path(testDir, "Splitable.data");
       FileTablespace sm = TablespaceManager.getLocalFs();
       Appender appender = sm.getAppender(meta, schema, tablePath);
@@ -348,8 +346,7 @@ public class TestStorages {
         .add("score", Type.FLOAT4)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
-    meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     if (dataFormat.equalsIgnoreCase(BuiltinStorages.AVRO)) {
       meta.putProperty(StorageConstants.AVRO_SCHEMA_LITERAL,
           TEST_PROJECTION_AVRO_SCHEMA);
@@ -424,9 +421,7 @@ public class TestStorages {
 
     Schema schema = schemaBld.build();
 
-    KeyValueSet options = new KeyValueSet();
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
-    meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     if (dataFormat.equalsIgnoreCase(BuiltinStorages.AVRO)) {
       String path = JavaResourceUtil.getResourceURL("dataset/testVariousTypes.avsc").toString();
       meta.putProperty(StorageConstants.AVRO_SCHEMA_URL, path);
@@ -496,9 +491,7 @@ public class TestStorages {
 
     Schema schema = schemaBld.build();
 
-    KeyValueSet options = new KeyValueSet();
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
-    meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     meta.putProperty(StorageConstants.TEXT_NULL, "\\\\N");
     meta.putProperty(StorageConstants.RCFILE_NULL, "\\\\N");
     meta.putProperty(StorageConstants.RCFILE_SERDE, TextSerializerDeserializer.class.getName());
@@ -593,9 +586,7 @@ public class TestStorages {
 
     Schema schema = schemaBld.build();
 
-    KeyValueSet options = new KeyValueSet();
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
-    meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     meta.putProperty(StorageConstants.TEXT_NULL, "\\\\N");
     meta.putProperty(StorageConstants.RCFILE_NULL, "\\\\N");
     meta.putProperty(StorageConstants.RCFILE_SERDE, TextSerializerDeserializer.class.getName());
@@ -698,8 +689,7 @@ public class TestStorages {
         .add("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()))
         .build();
 
-    KeyValueSet options = new KeyValueSet();
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     meta.putProperty(StorageConstants.CSVFILE_SERDE, TextSerializerDeserializer.class.getName());
 
     Path tablePath = new Path(testDir, "testRCFileTextSerializeDeserialize.data");
@@ -764,8 +754,7 @@ public class TestStorages {
         .add("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()))
         .build();
 
-    KeyValueSet options = new KeyValueSet();
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     meta.putProperty(StorageConstants.RCFILE_SERDE, BinarySerializerDeserializer.class.getName());
 
     Path tablePath = new Path(testDir, "testRCFileBinarySerializeDeserialize.data");
@@ -829,8 +818,7 @@ public class TestStorages {
         .add("col10", Type.INET4)
         .add("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName())).build();
 
-    KeyValueSet options = new KeyValueSet();
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     meta.putProperty(StorageConstants.SEQUENCEFILE_SERDE, TextSerializerDeserializer.class.getName());
 
     Path tablePath = new Path(testDir, "testSequenceFileTextSerializeDeserialize.data");
@@ -898,8 +886,7 @@ public class TestStorages {
         .add("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()))
         .build();
 
-    KeyValueSet options = new KeyValueSet();
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     meta.putProperty(StorageConstants.SEQUENCEFILE_SERDE, BinarySerializerDeserializer.class.getName());
 
     Path tablePath = new Path(testDir, "testVariousTypes.data");
@@ -963,8 +950,8 @@ public class TestStorages {
         schema.add("col" + index++, Type.TIME);
       }
 
-      KeyValueSet options = new KeyValueSet();
-      TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
+      TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
+      assertTrue(meta.containsProperty(StorageConstants.TIMEZONE));
 
       Path tablePath = new Path(testDir, "testTime.data");
       FileTablespace sm = TablespaceManager.getLocalFs();
@@ -1011,7 +998,7 @@ public class TestStorages {
         .add("comment", Type.TEXT)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     Path tablePath = new Path(testDir, "Seekable.data");
     FileTablespace sm = TablespaceManager.getLocalFs();
     FileAppender appender = (FileAppender) sm.getAppender(meta, schema, tablePath);
@@ -1089,8 +1076,7 @@ public class TestStorages {
         .add("col5", Type.INT8)
         .build();
 
-    KeyValueSet options = new KeyValueSet();
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     if (dataFormat.equalsIgnoreCase(BuiltinStorages.AVRO)) {
       meta.putProperty(StorageConstants.AVRO_SCHEMA_LITERAL, TEST_MAX_VALUE_AVRO_SCHEMA);
     }
@@ -1155,9 +1141,7 @@ public class TestStorages {
         .add("col3", Type.INT2)
         .build();
 
-    KeyValueSet options = new KeyValueSet();
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
-    meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     Path tablePath = new Path(testDir, "testLessThanSchemaSize.data");
     FileTablespace sm = TablespaceManager.getLocalFs();
@@ -1221,9 +1205,7 @@ public class TestStorages {
         .add("col1", Type.CHAR)
         .build();
 
-    KeyValueSet options = new KeyValueSet();
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
-    meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     Path tablePath = new Path(testDir, "test_dataformat_oversize.data");
     FileTablespace sm = TablespaceManager.getLocalFs();
@@ -1263,8 +1245,7 @@ public class TestStorages {
 
     Schema schema = SchemaBuilder.builder().add("col1", Type.TEXT).build();
 
-    KeyValueSet options = new KeyValueSet();
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     FileTablespace sm = TablespaceManager.getLocalFs();
     Path tablePath = new Path(testDir, "testTextHandling.data");
@@ -1307,8 +1288,7 @@ public class TestStorages {
         .add("score", Type.FLOAT4)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
-    meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     if (dataFormat.equalsIgnoreCase(BuiltinStorages.AVRO)) {
       meta.putProperty(StorageConstants.AVRO_SCHEMA_LITERAL,
           TEST_PROJECTION_AVRO_SCHEMA);
@@ -1345,8 +1325,7 @@ public class TestStorages {
         .add("col5", Type.INT8)
         .build();
 
-    KeyValueSet options = new KeyValueSet();
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     if (dataFormat.equalsIgnoreCase(BuiltinStorages.AVRO)) {
       meta.putProperty(StorageConstants.AVRO_SCHEMA_LITERAL, TEST_MAX_VALUE_AVRO_SCHEMA);
     }
@@ -1392,8 +1371,7 @@ public class TestStorages {
         .add("score", Type.FLOAT4)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
-    meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
+    TableMeta meta = CatalogUtil.newTableMeta(dataFormat, conf);
     if (dataFormat.equalsIgnoreCase(BuiltinStorages.AVRO)) {
       meta.putProperty(StorageConstants.AVRO_SCHEMA_LITERAL,
           TEST_PROJECTION_AVRO_SCHEMA);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/avro/TestAvroUtil.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/avro/TestAvroUtil.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/avro/TestAvroUtil.java
index ddeb340..705255d 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/avro/TestAvroUtil.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/avro/TestAvroUtil.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.storage.avro;
 
 import org.apache.avro.Schema;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.HttpFileServer;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.TableMeta;
@@ -58,12 +59,13 @@ public class TestAvroUtil {
 
   @Test
   public void testGetSchema() throws IOException, URISyntaxException {
-    TableMeta meta = CatalogUtil.newTableMeta("AVRO");
+    TajoConf conf = new TajoConf();
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.AVRO, conf);
     meta.putProperty(StorageConstants.AVRO_SCHEMA_LITERAL, FileUtil.readTextFile(new File(schemaUrl.getPath())));
-    Schema schema = AvroUtil.getAvroSchema(meta, new TajoConf());
+    Schema schema = AvroUtil.getAvroSchema(meta, conf);
     assertEquals(expected, schema);
 
-    meta = CatalogUtil.newTableMeta("AVRO");
+    meta = CatalogUtil.newTableMeta(BuiltinStorages.AVRO, conf);
     meta.putProperty(StorageConstants.AVRO_SCHEMA_URL, schemaUrl.getPath());
     schema = AvroUtil.getAvroSchema(meta, new TajoConf());
     assertEquals(expected, schema);
@@ -74,7 +76,7 @@ public class TestAvroUtil {
       InetSocketAddress addr = server.getBindAddress();
 
       String url = "http://127.0.0.1:" + addr.getPort() + schemaUrl.getPath();
-      meta = CatalogUtil.newTableMeta("AVRO");
+      meta = CatalogUtil.newTableMeta(BuiltinStorages.AVRO, conf);
       meta.putProperty(StorageConstants.AVRO_SCHEMA_URL, url);
       schema = AvroUtil.getAvroSchema(meta, new TajoConf());
     } finally {

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestBSTIndex.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestBSTIndex.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestBSTIndex.java
index 93052f2..0e6fde5 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestBSTIndex.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestBSTIndex.java
@@ -87,7 +87,7 @@ public class TestBSTIndex {
 
   @Test
   public void testFindValue() throws IOException {
-    meta = CatalogUtil.newTableMeta(dataFormat);
+    meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     Path tablePath = new Path(testDir, "testFindValue_" + dataFormat);
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
@@ -179,7 +179,7 @@ public class TestBSTIndex {
 
   @Test
   public void testBuildIndexWithAppender() throws IOException {
-    meta = CatalogUtil.newTableMeta(dataFormat);
+    meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     Path tablePath = new Path(testDir, "testBuildIndexWithAppender_" + dataFormat);
     FileAppender appender = (FileAppender) ((FileTablespace) TablespaceManager.getLocalFs())
@@ -260,7 +260,7 @@ public class TestBSTIndex {
 
   @Test
   public void testFindOmittedValue() throws IOException {
-    meta = CatalogUtil.newTableMeta(dataFormat);
+    meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     Path tablePath = StorageUtil.concatPath(testDir, "testFindOmittedValue_" + dataFormat);
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs()).getAppender(meta, schema, tablePath);
@@ -332,7 +332,7 @@ public class TestBSTIndex {
 
   @Test
   public void testFindNextKeyValue() throws IOException {
-    meta = CatalogUtil.newTableMeta(dataFormat);
+    meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     Path tablePath = new Path(testDir, "testFindNextKeyValue_" + dataFormat);
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
@@ -426,7 +426,7 @@ public class TestBSTIndex {
 
   @Test
   public void testFindNextKeyOmittedValue() throws IOException {
-    meta = CatalogUtil.newTableMeta(dataFormat);
+    meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     Path tablePath = new Path(testDir, "testFindNextKeyOmittedValue_" + dataFormat);
     Appender appender = (((FileTablespace) TablespaceManager.getLocalFs()))
@@ -509,7 +509,7 @@ public class TestBSTIndex {
 
   @Test
   public void testFindMinValue() throws IOException {
-    meta = CatalogUtil.newTableMeta(dataFormat);
+    meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     Path tablePath = new Path(testDir, "testFindMinValue" + dataFormat);
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
@@ -596,7 +596,7 @@ public class TestBSTIndex {
 
   @Test
   public void testMinMax() throws IOException {
-    meta = CatalogUtil.newTableMeta(dataFormat);
+    meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     Path tablePath = new Path(testDir, "testMinMax_" + dataFormat);
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
@@ -703,7 +703,7 @@ public class TestBSTIndex {
 
   @Test
   public void testConcurrentAccess() throws IOException, InterruptedException {
-    meta = CatalogUtil.newTableMeta(dataFormat);
+    meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     Path tablePath = new Path(testDir, "testConcurrentAccess_" + dataFormat);
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
@@ -786,7 +786,7 @@ public class TestBSTIndex {
 
   @Test
   public void testFindValueDescOrder() throws IOException {
-    meta = CatalogUtil.newTableMeta(dataFormat);
+    meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     Path tablePath = new Path(testDir, "testFindValueDescOrder_" + dataFormat);
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
@@ -881,7 +881,7 @@ public class TestBSTIndex {
 
   @Test
   public void testFindNextKeyValueDescOrder() throws IOException {
-    meta = CatalogUtil.newTableMeta(dataFormat);
+    meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     Path tablePath = new Path(testDir, "testFindNextKeyValueDescOrder_" + dataFormat);
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs()).getAppender(meta, schema, tablePath);
@@ -980,7 +980,7 @@ public class TestBSTIndex {
 
   @Test
   public void testFindValueASCOrder() throws IOException {
-    meta = CatalogUtil.newTableMeta(dataFormat);
+    meta = CatalogUtil.newTableMeta(dataFormat, conf);
 
     Path tablePath = new Path(testDir, "testFindValue_" + dataFormat);
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestSingleCSVFileBSTIndex.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestSingleCSVFileBSTIndex.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestSingleCSVFileBSTIndex.java
index 358be38..4f6b566 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestSingleCSVFileBSTIndex.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/index/TestSingleCSVFileBSTIndex.java
@@ -73,7 +73,7 @@ public class TestSingleCSVFileBSTIndex {
 
   @Test
   public void testFindValueInSingleCSV() throws IOException {
-    meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT);
+    meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
 
     Path tablePath = StorageUtil.concatPath(testDir, "testFindValueInSingleCSV", "table.csv");
     fs.mkdirs(tablePath.getParent());
@@ -165,7 +165,7 @@ public class TestSingleCSVFileBSTIndex {
 
   @Test
   public void testFindNextKeyValueInSingleCSV() throws IOException {
-    meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT);
+    meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
 
     Path tablePath = StorageUtil.concatPath(testDir, "testFindNextKeyValueInSingleCSV",
         "table1.csv");

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/json/TestJsonSerDe.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/json/TestJsonSerDe.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/json/TestJsonSerDe.java
index 30367c2..8cf4586 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/json/TestJsonSerDe.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/json/TestJsonSerDe.java
@@ -21,6 +21,7 @@ package org.apache.tajo.storage.json;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SchemaBuilder;
@@ -70,7 +71,7 @@ public class TestJsonSerDe {
   public void testVarioutType() throws IOException {
     TajoConf conf = new TajoConf();
 
-    TableMeta meta = CatalogUtil.newTableMeta("JSON");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.JSON, conf);
     Path tablePath = new Path(getResourcePath("dataset", "TestJsonSerDe"), "testVariousType.json");
     FileSystem fs = FileSystem.getLocal(conf);
     FileStatus status = fs.getFileStatus(tablePath);
@@ -104,7 +105,7 @@ public class TestJsonSerDe {
   public void testUnicodeWithControlChar() throws IOException {
     TajoConf conf = new TajoConf();
 
-    TableMeta meta = CatalogUtil.newTableMeta("JSON");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.JSON, conf);
     Path tablePath = new Path(getResourcePath("dataset", "TestJsonSerDe"), "testUnicodeWithControlChar.json");
     FileSystem fs = FileSystem.getLocal(conf);
     FileStatus status = fs.getFileStatus(tablePath);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/raw/TestDirectRawFile.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/raw/TestDirectRawFile.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/raw/TestDirectRawFile.java
index 19e3e95..569438e 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/raw/TestDirectRawFile.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/raw/TestDirectRawFile.java
@@ -172,7 +172,7 @@ public class TestDirectRawFile {
 
     MemoryRowBlock rowBlock = createRowBlock(rowNum);
 
-    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.DRAW);
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.DRAW, tajoConf);
     FileStatus outputFile = writeRowBlock(tajoConf, meta, rowBlock);
     rowBlock.release();
 
@@ -201,7 +201,7 @@ public class TestDirectRawFile {
     int rowNum = 2;
 
     MemoryRowBlock rowBlock = createRowBlock(rowNum);
-    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.DRAW);
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.DRAW, tajoConf);
     FileStatus outputFile = writeRowBlock(tajoConf, meta, rowBlock);
 
     rowBlock.release();
@@ -230,7 +230,7 @@ public class TestDirectRawFile {
 
     MemoryRowBlock rowBlock = createRowBlock(rowNum);
 
-    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.DRAW);
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.DRAW, tajoConf);
     FileStatus outputFile = writeRowBlock(tajoConf, meta, rowBlock);
     rowBlock.release();
 


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

Posted by jh...@apache.org.
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)


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

Posted by jh...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestTimezone.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestTimezone.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestTimezone.java
index 5034008..9c47d13 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestTimezone.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestTimezone.java
@@ -19,7 +19,6 @@
 package org.apache.tajo.engine.query;
 
 import org.apache.tajo.QueryTestCaseBase;
-import org.apache.tajo.client.ResultSetUtil;
 import org.apache.tajo.exception.TajoException;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -85,6 +84,28 @@ public class TestTimezone extends QueryTestCaseBase {
     }
   }
 
+  @Test
+  public void testCTASWithTimezone() throws TajoException, SQLException, IOException {
+    executeString(String.format("SET TIME ZONE TO '%s'", timezone)).close();
+    try {
+      executeString("create table test1 (col1 TIMESTAMP)").close();
+      executeString("insert overwrite into test1 select '2015-08-12 14:00:00'::TIMESTAMP").close();
+      try (ResultSet res = executeString("select * from test1")) {
+        assertTrue(res.next());
+        assertEquals("2015-08-12 14:00:00", res.getString(1));
+      }
+
+      executeString("create table test2 as select * from test1").close();
+      try (ResultSet res = executeString("select * from test2")) {
+        assertTrue(res.next());
+        assertEquals("2015-08-12 14:00:00", res.getString(1));
+      }
+    } finally {
+      executeString("drop table test1 purge").close();
+      executeString("drop table test2 purge").close();
+    }
+  }
+
   @Parameters(name = "{index}: {0}")
   public static Collection<Object []> getParameters() {
     return Arrays.asList(new Object[][]{

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/BenchmarkSort.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/BenchmarkSort.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/BenchmarkSort.java
index d681d11..2c67a2d 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/BenchmarkSort.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/BenchmarkSort.java
@@ -19,10 +19,7 @@
 package org.apache.tajo.engine.util;
 
 import org.apache.hadoop.fs.Path;
-import org.apache.tajo.LocalTajoTestingUtility;
-import org.apache.tajo.SessionVars;
-import org.apache.tajo.TajoConstants;
-import org.apache.tajo.TajoTestingCluster;
+import org.apache.tajo.*;
 import org.apache.tajo.algebra.Expr;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -42,10 +39,7 @@ import org.apache.tajo.plan.LogicalOptimizer;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.LogicalPlanner;
 import org.apache.tajo.plan.logical.LogicalNode;
-import org.apache.tajo.storage.Appender;
-import org.apache.tajo.storage.FileTablespace;
-import org.apache.tajo.storage.TablespaceManager;
-import org.apache.tajo.storage.VTuple;
+import org.apache.tajo.storage.*;
 import org.apache.tajo.storage.fragment.FileFragment;
 import org.apache.tajo.util.CommonTestingUtil;
 import org.apache.tajo.worker.TaskAttemptContext;
@@ -114,7 +108,7 @@ public class BenchmarkSort {
         new Column("col14", Type.INT8),
     }).build();
 
-    TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta employeeMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     Path employeePath = new Path(testDir, "employee.csv");
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(employeeMeta, schema, employeePath);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java b/tajo-core-tests/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java
index 7c6d892..56334ae 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/master/TestExecutionBlockCursor.java
@@ -15,6 +15,7 @@
 package org.apache.tajo.master;
 
 import org.apache.hadoop.yarn.event.AsyncDispatcher;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.algebra.Expr;
@@ -25,12 +26,12 @@ import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.conf.TajoConf;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.planner.global.ExecutionBlock;
 import org.apache.tajo.engine.planner.global.ExecutionBlockCursor;
 import org.apache.tajo.engine.planner.global.GlobalPlanner;
 import org.apache.tajo.engine.planner.global.MasterPlan;
 import org.apache.tajo.engine.query.QueryContext;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalOptimizer;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.LogicalPlanner;
@@ -69,7 +70,7 @@ public class TestExecutionBlockCursor {
     tpch.loadSchemas();
     tpch.loadOutSchema();
     for (String table : tpch.getTableNames()) {
-      TableMeta m = CatalogUtil.newTableMeta("TEXT");
+      TableMeta m = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
       TableDesc d = CatalogUtil.newTableDesc(
           CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, table), tpch.getSchema(table), m, CommonTestingUtil.getTestDir());
       TableStats stats = new TableStats();

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestQueryOnOrcFile.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestQueryOnOrcFile.java b/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestQueryOnOrcFile.java
index 29d132e..10f4265 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestQueryOnOrcFile.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestQueryOnOrcFile.java
@@ -47,7 +47,6 @@ public class TestQueryOnOrcFile extends QueryTestCaseBase {
     executeString("SET TIME ZONE 'GMT+9'");
     ResultSet res = executeQuery();
     assertResultSet(res);
-    executeString("SET TIME ZONE 'GMT'");
     cleanupQuery(res);
   }
 
@@ -56,7 +55,6 @@ public class TestQueryOnOrcFile extends QueryTestCaseBase {
     executeString("SET TIME ZONE 'GMT+1'");
     ResultSet res = executeString("select * from timezoned_orc");
     assertResultSet(res);
-    executeString("SET TIME ZONE 'GMT'");
     cleanupQuery(res);
   }
 
@@ -73,7 +71,6 @@ public class TestQueryOnOrcFile extends QueryTestCaseBase {
     executeString("\\set TIMEZONE 'GMT-5'");
     ResultSet res = executeString("select * from timezoned_orc");
     assertResultSet(res);
-    executeString("SET TIME ZONE 'GMT'");
     cleanupQuery(res);
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestRowFile.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestRowFile.java b/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestRowFile.java
index cce0f4c..0173f59 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestRowFile.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestRowFile.java
@@ -69,7 +69,7 @@ public class TestRowFile {
         .add("description", Type.TEXT)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta("ROWFILE");
+    TableMeta meta = CatalogUtil.newTableMeta("ROWFILE", conf);
 
     FileTablespace sm = (FileTablespace) TablespaceManager.get(cluster.getDefaultFileSystem().getUri());
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/worker/TestTaskExecutor.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/worker/TestTaskExecutor.java b/tajo-core-tests/src/test/java/org/apache/tajo/worker/TestTaskExecutor.java
index df5b3c8..311f194 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/worker/TestTaskExecutor.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/worker/TestTaskExecutor.java
@@ -24,6 +24,7 @@ import org.apache.hadoop.yarn.event.AsyncDispatcher;
 import org.apache.tajo.*;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.conf.TajoConf;
+import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.master.cluster.WorkerConnectionInfo;
 import org.apache.tajo.rpc.CallFuture;
 import org.apache.tajo.worker.event.NodeResourceAllocateEvent;
@@ -209,7 +210,8 @@ public class TestTaskExecutor {
     @Override
     protected Task createTask(final ExecutionBlockContext context, TaskRequestProto taskRequest) {
       final TaskAttemptId taskAttemptId = new TaskAttemptId(taskRequest.getId());
-      final TaskAttemptContext taskAttemptContext = new TaskAttemptContext(null, context, taskAttemptId, null, null);
+      final TaskAttemptContext taskAttemptContext =
+          new TaskAttemptContext(new QueryContext(conf), context, taskAttemptId, null, null);
 
       return new Task() {
         @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/resources/results/TestJsonWithTimezone/testTimezonedTable2.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestJsonWithTimezone/testTimezonedTable2.result b/tajo-core-tests/src/test/resources/results/TestJsonWithTimezone/testTimezonedTable2.result
index 8b13e55..242e743 100644
--- a/tajo-core-tests/src/test/resources/results/TestJsonWithTimezone/testTimezonedTable2.result
+++ b/tajo-core-tests/src/test/resources/results/TestJsonWithTimezone/testTimezonedTable2.result
@@ -1,5 +1,5 @@
 t_timestamp,t_time,t_date
 -------------------------------
-1980-03-31 16:50:30.01,16:50:30.01,1980-04-01
-1980-03-31 16:50:30,16:50:30,1980-04-01
-1980-03-31 16:50:30,16:50:30,1980-04-01
\ No newline at end of file
+1980-03-31 16:50:30.01,01:50:30.01,1980-04-01
+1980-03-31 16:50:30,01:50:30,1980-04-01
+1980-03-31 16:50:30,01:50:30,1980-04-01
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/resources/results/TestSelectQuery/testTimezonedTable2.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testTimezonedTable2.result b/tajo-core-tests/src/test/resources/results/TestSelectQuery/testTimezonedTable2.result
index 8b13e55..242e743 100644
--- a/tajo-core-tests/src/test/resources/results/TestSelectQuery/testTimezonedTable2.result
+++ b/tajo-core-tests/src/test/resources/results/TestSelectQuery/testTimezonedTable2.result
@@ -1,5 +1,5 @@
 t_timestamp,t_time,t_date
 -------------------------------
-1980-03-31 16:50:30.01,16:50:30.01,1980-04-01
-1980-03-31 16:50:30,16:50:30,1980-04-01
-1980-03-31 16:50:30,16:50:30,1980-04-01
\ No newline at end of file
+1980-03-31 16:50:30.01,01:50:30.01,1980-04-01
+1980-03-31 16:50:30,01:50:30,1980-04-01
+1980-03-31 16:50:30,01:50:30,1980-04-01
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTable1.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTable1.result b/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTable1.result
index f065e6e..a1baa09 100644
--- a/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTable1.result
+++ b/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTable1.result
@@ -5,7 +5,8 @@ table uri: ${table.path}
 store type: TEXT
 number of rows: 0
 volume: 0 B
-Options: 
+Options:
+	'timezone'='${table.timezone}'
 	'text.delimiter'='|'
 
 schema: 
@@ -19,7 +20,8 @@ table uri: ${table.path}
 store type: TEXT
 number of rows: 0
 volume: 0 B
-Options: 
+Options:
+	'timezone'='${table.timezone}'
 	'text.delimiter'='|'
 
 schema: 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTable2.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTable2.result b/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTable2.result
index 8534299..9c0abbf 100644
--- a/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTable2.result
+++ b/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTable2.result
@@ -5,7 +5,8 @@ table uri: ${table.path}
 store type: TEXT
 number of rows: 0
 volume: 0 B
-Options: 
+Options:
+	'timezone'='${table.timezone}'
 	'text.delimiter'='|'
 
 schema: 
@@ -19,9 +20,10 @@ table uri: ${table.path}
 store type: TEXT
 number of rows: 0
 volume: 0 B
-Options: 
+Options:
+	'timezone'='${table.timezone}'
 	'text.delimiter'='|'
 
 schema: 
 col1	INT4
-col2	INT4
\ No newline at end of file
+col2	INT4

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTableForNestedSchema.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTableForNestedSchema.result b/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTableForNestedSchema.result
index 29106b3..6337edf 100644
--- a/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTableForNestedSchema.result
+++ b/tajo-core-tests/src/test/resources/results/TestTajoCli/testDescTableForNestedSchema.result
@@ -5,7 +5,8 @@ table uri: ${table.path}
 store type: TEXT
 number of rows: 0
 volume: 0 B
-Options: 
+Options:
+	'timezone'='${table.timezone}'
 	'text.delimiter'='|'
 
 schema: 
@@ -20,7 +21,8 @@ table uri: ${table.path}
 store type: TEXT
 number of rows: 0
 volume: 0 B
-Options: 
+Options:
+	'timezone'='${table.timezone}'
 	'text.delimiter'='|'
 
 schema: 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump1.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump1.result b/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump1.result
index 8accece..328b852 100644
--- a/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump1.result
+++ b/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump1.result
@@ -12,5 +12,5 @@ CREATE DATABASE IF NOT EXISTS "TestTajoDump";
 --
 -- Name: "TestTajoDump"."TableName1"; Type: TABLE; Storage: TEXT
 --
-CREATE TABLE "TestTajoDump"."TableName1" ("Age" INT4, "FirstName" TEXT, lastname TEXT) USING TEXT WITH ('text.delimiter'='|');
+CREATE TABLE "TestTajoDump"."TableName1" ("Age" INT4, "FirstName" TEXT, lastname TEXT) USING TEXT WITH ('text.delimiter'='|', 'timezone'='${table.timezone}');
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump2.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump2.result b/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump2.result
index 787562e..d84e830 100644
--- a/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump2.result
+++ b/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump2.result
@@ -12,5 +12,5 @@ CREATE DATABASE IF NOT EXISTS "TestTajoDump";
 --
 -- Name: "TestTajoDump"."TableName2"; Type: TABLE; Storage: TEXT
 --
-CREATE TABLE "TestTajoDump"."TableName2" ("Age" INT4, "Name" RECORD ("FirstName" TEXT, lastname TEXT)) USING TEXT WITH ('text.delimiter'='|');
+CREATE TABLE "TestTajoDump"."TableName2" ("Age" INT4, "Name" RECORD ("FirstName" TEXT, lastname TEXT)) USING TEXT WITH ('text.delimiter'='|', 'timezone'='${table.timezone}');
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump3.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump3.result b/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump3.result
index 1bde41d..b3cd13f 100644
--- a/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump3.result
+++ b/tajo-core-tests/src/test/resources/results/TestTajoDump/testDump3.result
@@ -12,7 +12,7 @@ CREATE DATABASE IF NOT EXISTS "TestTajoDump";
 --
 -- Name: "TestTajoDump"."TableName1"; Type: TABLE; Storage: TEXT
 --
-CREATE TABLE "TestTajoDump"."TableName1" ("Age" INT4, "FirstName" TEXT, lastname TEXT) USING TEXT WITH ('text.delimiter'='|');
+CREATE TABLE "TestTajoDump"."TableName1" ("Age" INT4, "FirstName" TEXT, lastname TEXT) USING TEXT WITH ('text.delimiter'='|', 'timezone'='${table.timezone}');
 
 --
 -- Name: test_idx; Type: INDEX; Index Method: TWO_LEVEL_BIN_TREE

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/resources/results/TestTajoDump/testPartitionsDump.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/TestTajoDump/testPartitionsDump.result b/tajo-core-tests/src/test/resources/results/TestTajoDump/testPartitionsDump.result
index 677b5f2..e7b1ccd 100644
--- a/tajo-core-tests/src/test/resources/results/TestTajoDump/testPartitionsDump.result
+++ b/tajo-core-tests/src/test/resources/results/TestTajoDump/testPartitionsDump.result
@@ -12,7 +12,7 @@ CREATE DATABASE IF NOT EXISTS "TestTajoDump";
 --
 -- Name: "TestTajoDump"."TableName3"; Type: TABLE; Storage: TEXT
 --
-CREATE TABLE "TestTajoDump"."TableName3" (col1 INT4, col2 INT4) USING TEXT WITH ('text.delimiter'='|') PARTITION BY COLUMN(col3 INT4, col4 INT4);
+CREATE TABLE "TestTajoDump"."TableName3" (col1 INT4, col2 INT4) USING TEXT WITH ('text.delimiter'='|', 'timezone'='${table.timezone}') PARTITION BY COLUMN(col3 INT4, col4 INT4);
 
 --
 -- Table Partitions: TableName3
@@ -24,7 +24,7 @@ ALTER TABLE "TestTajoDump"."TableName3" REPAIR PARTITION;
 --
 -- Name: "TestTajoDump"."TableName4"; Type: TABLE; Storage: TEXT
 --
-CREATE TABLE "TestTajoDump"."TableName4" (col1 INT4, col2 INT4) USING TEXT WITH ('text.delimiter'='|') PARTITION BY COLUMN(col3 TEXT, col4 DATE);
+CREATE TABLE "TestTajoDump"."TableName4" (col1 INT4, col2 INT4) USING TEXT WITH ('text.delimiter'='|', 'timezone'='${table.timezone}') PARTITION BY COLUMN(col3 TEXT, col4 DATE);
 
 --
 -- Table Partitions: TableName4

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLForBaseTable.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLForBaseTable.result b/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLForBaseTable.result
index 7e10a3b..c635e5d 100644
--- a/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLForBaseTable.result
+++ b/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLForBaseTable.result
@@ -1,4 +1,4 @@
 --
 -- Name: db1.table2; Type: TABLE; Storage: TEXT
 --
-CREATE TABLE db1.table2 (name BLOB, addr TEXT) USING TEXT WITH ('compression.codec'='org.apache.hadoop.io.compress.GzipCodec', 'text.delimiter'='|');
\ No newline at end of file
+CREATE TABLE db1.table2 (name BLOB, addr TEXT) USING TEXT WITH ('compression.codec'='org.apache.hadoop.io.compress.GzipCodec', 'text.delimiter'='|', 'timezone'='Asia/Seoul');
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLForExternalTable.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLForExternalTable.result b/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLForExternalTable.result
index 535bc11..011dfc1 100644
--- a/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLForExternalTable.result
+++ b/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLForExternalTable.result
@@ -2,4 +2,4 @@
 -- Name: db1.table1; Type: TABLE; Storage: TEXT
 -- Path: /table1
 --
-CREATE EXTERNAL TABLE db1.table1 (name BLOB, addr TEXT) USING TEXT WITH ('compression.codec'='org.apache.hadoop.io.compress.GzipCodec', 'text.delimiter'='|') PARTITION BY COLUMN(key INT4, key2 TEXT) LOCATION '/table1';
\ No newline at end of file
+CREATE EXTERNAL TABLE db1.table1 (name BLOB, addr TEXT) USING TEXT WITH ('compression.codec'='org.apache.hadoop.io.compress.GzipCodec', 'text.delimiter'='|', 'timezone'='Asia/Seoul') PARTITION BY COLUMN(key INT4, key2 TEXT) LOCATION '/table1';
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLQuotedTableName1.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLQuotedTableName1.result b/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLQuotedTableName1.result
index 34b6fb3..a432033 100644
--- a/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLQuotedTableName1.result
+++ b/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLQuotedTableName1.result
@@ -2,4 +2,4 @@
 -- Name: db1."TABLE2"; Type: TABLE; Storage: TEXT
 -- Path: /table1
 --
-CREATE EXTERNAL TABLE db1."TABLE2" (name BLOB, addr TEXT, "FirstName" TEXT, "LastName" TEXT, "with" TEXT) USING TEXT WITH ('compression.codec'='org.apache.hadoop.io.compress.GzipCodec', 'text.delimiter'='|') PARTITION BY COLUMN("BirthYear" INT4) LOCATION '/table1';
\ No newline at end of file
+CREATE EXTERNAL TABLE db1."TABLE2" (name BLOB, addr TEXT, "FirstName" TEXT, "LastName" TEXT, "with" TEXT) USING TEXT WITH ('compression.codec'='org.apache.hadoop.io.compress.GzipCodec', 'text.delimiter'='|', 'timezone'='Asia/Seoul') PARTITION BY COLUMN("BirthYear" INT4) LOCATION '/table1';
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLQuotedTableName2.result
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLQuotedTableName2.result b/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLQuotedTableName2.result
index cd1ebf8..2e175de 100644
--- a/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLQuotedTableName2.result
+++ b/tajo-core-tests/src/test/resources/results/testDDLBuilder/testBuildDDLQuotedTableName2.result
@@ -1,4 +1,4 @@
 --
 -- Name: db1."TABLE1"; Type: TABLE; Storage: TEXT
 --
-CREATE TABLE db1."TABLE1" (name BLOB, addr TEXT, "FirstName" TEXT, "LastName" TEXT, "with" TEXT) USING TEXT WITH ('compression.codec'='org.apache.hadoop.io.compress.GzipCodec', 'text.delimiter'='|') PARTITION BY COLUMN("BirthYear" INT4);
\ No newline at end of file
+CREATE TABLE db1."TABLE1" (name BLOB, addr TEXT, "FirstName" TEXT, "LastName" TEXT, "with" TEXT) USING TEXT WITH ('compression.codec'='org.apache.hadoop.io.compress.GzipCodec', 'text.delimiter'='|', 'timezone'='Asia/Seoul') PARTITION BY COLUMN("BirthYear" INT4);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java b/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java
index 3ff773b..87e1b54 100644
--- a/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java
+++ b/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java
@@ -22,6 +22,7 @@ import com.google.common.collect.Maps;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SchemaBuilder;
@@ -30,8 +31,8 @@ import org.apache.tajo.catalog.partition.PartitionMethodDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.Type;
+import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.exception.TajoException;
-import org.apache.tajo.storage.StorageConstants;
 
 import java.io.IOException;
 import java.util.Map;
@@ -211,8 +212,7 @@ public class TPCH extends BenchmarkSet {
   }
 
   public void loadTable(String tableName) throws TajoException {
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
-    meta.putProperty(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, new TajoConf());
 
     PartitionMethodDesc partitionMethodDesc = null;
     if (tableName.equals(CUSTOMER_PARTS)) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddDays.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddDays.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddDays.java
index 5543024..4543441 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddDays.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddDays.java
@@ -18,16 +18,22 @@
 
 package org.apache.tajo.engine.function.datetime;
 
+import org.apache.tajo.OverridableConf;
+import org.apache.tajo.SessionVars;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
+import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.IntervalDatum;
-import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
+import org.apache.tajo.plan.expr.FunctionEval;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.storage.Tuple;
 
+import java.util.TimeZone;
+
 @Description(
     functionName = "add_days",
     description = "Return date value which is added with given parameter.",
@@ -44,6 +50,7 @@ import org.apache.tajo.storage.Tuple;
     }
 )
 public class AddDays extends GeneralFunction {
+
   public AddDays() {
     super(new Column[]{
         new Column("date", TajoDataTypes.Type.DATE),
@@ -52,8 +59,14 @@ public class AddDays extends GeneralFunction {
   }
 
   @Override
+  public void init(OverridableConf context, FunctionEval.ParamType[] types) {
+    setTimeZone(TimeZone.getTimeZone(context.get(SessionVars.TIMEZONE)));
+  }
+
+  @Override
   public Datum eval(Tuple params) {
-    Datum dateDatum = params.asDatum(0);
+    // cast to UTC timestamp
+    Datum dateDatum = DatumFactory.createTimestamp(params.asDatum(0), getTimeZone());
     long val = params.getInt8(1);
     if (val >= 0) {
       return dateDatum.plus(new IntervalDatum(val * IntervalDatum.DAY_MILLIS));

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddMonths.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddMonths.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddMonths.java
index 016a25c..80292ca 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddMonths.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/AddMonths.java
@@ -18,16 +18,22 @@
 
 package org.apache.tajo.engine.function.datetime;
 
+import org.apache.tajo.OverridableConf;
+import org.apache.tajo.SessionVars;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
+import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.IntervalDatum;
-import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
+import org.apache.tajo.plan.expr.FunctionEval;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.storage.Tuple;
 
+import java.util.TimeZone;
+
 @Description(
     functionName = "add_months",
     description = "Return date value which is added with given parameter.",
@@ -44,6 +50,7 @@ import org.apache.tajo.storage.Tuple;
     }
 )
 public class AddMonths extends GeneralFunction {
+
   public AddMonths() {
     super(new Column[]{
         new Column("date", TajoDataTypes.Type.DATE),
@@ -52,8 +59,15 @@ public class AddMonths extends GeneralFunction {
   }
 
   @Override
+  public void init(OverridableConf context, FunctionEval.ParamType[] types) {
+    setTimeZone(TimeZone.getTimeZone(context.get(SessionVars.TIMEZONE)));
+  }
+
+  @Override
   public Datum eval(Tuple params) {
-    Datum dateDatum = params.asDatum(0);
+    // cast to UTC timestamp
+    Datum dateDatum = DatumFactory.createTimestamp(params.asDatum(0), getTimeZone());
+
     int val = params.getInt4(1);
     if (val >= 0) {
       return dateDatum.plus(new IntervalDatum(val, 0));

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/CurrentDate.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/CurrentDate.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/CurrentDate.java
index d57ac02..378ae3f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/CurrentDate.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/CurrentDate.java
@@ -18,10 +18,8 @@
 
 package org.apache.tajo.engine.function.datetime;
 
-import com.google.gson.annotations.Expose;
 import org.apache.tajo.OverridableConf;
 import org.apache.tajo.SessionVars;
-import org.apache.tajo.TajoConstants;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.DateDatum;
 import org.apache.tajo.datum.Datum;
@@ -44,7 +42,6 @@ import java.util.TimeZone;
     paramTypes = {@ParamTypes(paramTypes = {})}
 )
 public class CurrentDate extends GeneralFunction {
-  @Expose private TimeZone timezone;
   private DateDatum datum;
 
   public CurrentDate() {
@@ -53,8 +50,9 @@ public class CurrentDate extends GeneralFunction {
 
   @Override
   public void init(OverridableConf context, FunctionEval.ParamType[] types) {
-    String timezoneId = context.get(SessionVars.TIMEZONE, TajoConstants.DEFAULT_SYSTEM_TIMEZONE);
-    timezone = TimeZone.getTimeZone(timezoneId);
+    if (!hasTimeZone()) {
+      setTimeZone(TimeZone.getTimeZone(context.get(SessionVars.TIMEZONE)));
+    }
   }
 
   @Override
@@ -63,7 +61,7 @@ public class CurrentDate extends GeneralFunction {
       long julianTimestamp = DateTimeUtil.javaTimeToJulianTime(System.currentTimeMillis());
       TimeMeta tm = new TimeMeta();
       DateTimeUtil.toJulianTimeMeta(julianTimestamp, tm);
-      DateTimeUtil.toUserTimezone(tm, timezone);
+      DateTimeUtil.toUserTimezone(tm, getTimeZone());
       datum = DatumFactory.createDate(tm.years, tm.monthOfYear, tm.dayOfMonth);
     }
     return datum;

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/CurrentTime.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/CurrentTime.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/CurrentTime.java
index 0ba5ca0..1e8eb2d 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/CurrentTime.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/CurrentTime.java
@@ -18,17 +18,22 @@
 
 package org.apache.tajo.engine.function.datetime;
 
+import org.apache.tajo.OverridableConf;
+import org.apache.tajo.SessionVars;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.TimeDatum;
-import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
+import org.apache.tajo.plan.expr.FunctionEval;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.util.datetime.DateTimeUtil;
 import org.apache.tajo.util.datetime.TimeMeta;
 
+import java.util.TimeZone;
+
 @Description(
     functionName = "current_time",
     description = "Get current time. Result is TIME type.",
@@ -44,11 +49,19 @@ public class CurrentTime extends GeneralFunction {
   }
 
   @Override
+  public void init(OverridableConf context, FunctionEval.ParamType [] types) {
+    if (!hasTimeZone()) {
+      setTimeZone(TimeZone.getTimeZone(context.get(SessionVars.TIMEZONE)));
+    }
+  }
+
+  @Override
   public Datum eval(Tuple params) {
     if (datum == null) {
       long julianTimestamp = DateTimeUtil.javaTimeToJulianTime(System.currentTimeMillis());
       TimeMeta tm = new TimeMeta();
       DateTimeUtil.toJulianTimeMeta(julianTimestamp, tm);
+      DateTimeUtil.toUserTimezone(tm, getTimeZone());
       datum = DatumFactory.createTime(DateTimeUtil.toTime(tm));
     }
     return datum;

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTime.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTime.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTime.java
index 8848af6..3911ae8 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTime.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTime.java
@@ -18,10 +18,7 @@
 
 package org.apache.tajo.engine.function.datetime;
 
-import com.google.gson.annotations.Expose;
 import org.apache.tajo.OverridableConf;
-import org.apache.tajo.SessionVars;
-import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
@@ -33,14 +30,9 @@ import org.apache.tajo.plan.expr.FunctionEval;
 import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.util.datetime.DateTimeConstants;
-import org.apache.tajo.util.datetime.DateTimeUtil;
 import org.apache.tajo.util.datetime.TimeMeta;
 
-import java.util.TimeZone;
-
-import static org.apache.tajo.common.TajoDataTypes.Type.TIME;
-import static org.apache.tajo.common.TajoDataTypes.Type.FLOAT8;
-import static org.apache.tajo.common.TajoDataTypes.Type.TEXT;
+import static org.apache.tajo.common.TajoDataTypes.Type.*;
 
 @Description(
     functionName = "date_part",
@@ -51,7 +43,6 @@ import static org.apache.tajo.common.TajoDataTypes.Type.TEXT;
     paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TIME})}
 )
 public class DatePartFromTime extends GeneralFunction {
-  @Expose  private TimeZone timezone;
   private DatePartExtractorFromTime extractor = null;
 
   public DatePartFromTime() {
@@ -63,8 +54,6 @@ public class DatePartFromTime extends GeneralFunction {
 
   @Override
   public void init(OverridableConf context, FunctionEval.ParamType [] types) {
-    String timezoneId = context.get(SessionVars.TIMEZONE, TajoConstants.DEFAULT_SYSTEM_TIMEZONE);
-    timezone = TimeZone.getTimeZone(timezoneId);
   }
 
   @Override
@@ -93,7 +82,6 @@ public class DatePartFromTime extends GeneralFunction {
     }
 
     TimeMeta tm = params.getTimeDate(1);
-    DateTimeUtil.toUserTimezone(tm, timezone);
     return extractor.extract(tm);
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTimestamp.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTimestamp.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTimestamp.java
index 05fa8e4..48ca7b2 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTimestamp.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/DatePartFromTimestamp.java
@@ -18,17 +18,17 @@
 
 package org.apache.tajo.engine.function.datetime;
 
-import com.google.gson.annotations.Expose;
 import org.apache.tajo.OverridableConf;
 import org.apache.tajo.SessionVars;
-import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.common.TajoDataTypes;
-import org.apache.tajo.datum.*;
-import org.apache.tajo.plan.expr.FunctionEval;
-import org.apache.tajo.plan.function.GeneralFunction;
+import org.apache.tajo.datum.Datum;
+import org.apache.tajo.datum.DatumFactory;
+import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
+import org.apache.tajo.plan.expr.FunctionEval;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.util.datetime.DateTimeConstants;
 import org.apache.tajo.util.datetime.DateTimeUtil;
@@ -47,7 +47,6 @@ import static org.apache.tajo.common.TajoDataTypes.Type.*;
     paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TIMESTAMP})}
 )
 public class DatePartFromTimestamp extends GeneralFunction {
-  @Expose private TimeZone timezone;
   private DatePartExtractorFromTimestamp extractor = null;
 
   public DatePartFromTimestamp() {
@@ -59,8 +58,7 @@ public class DatePartFromTimestamp extends GeneralFunction {
 
   @Override
   public void init(OverridableConf context, FunctionEval.ParamType [] types) {
-    String timezoneId = context.get(SessionVars.TIMEZONE, TajoConstants.DEFAULT_SYSTEM_TIMEZONE);
-    timezone = TimeZone.getTimeZone(timezoneId);
+    setTimeZone(TimeZone.getTimeZone(context.get(SessionVars.TIMEZONE)));
   }
 
   @Override
@@ -121,7 +119,7 @@ public class DatePartFromTimestamp extends GeneralFunction {
     }
 
     TimeMeta tm = params.getTimeDate(1);
-    DateTimeUtil.toUserTimezone(tm, timezone);
+    DateTimeUtil.toUserTimezone(tm, getTimeZone());
 
     return extractor.extract(tm);
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java
index 7b620e9..39f112d 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToCharTimestamp.java
@@ -18,10 +18,7 @@
 
 package org.apache.tajo.engine.function.datetime;
 
-import com.google.gson.annotations.Expose;
 import org.apache.tajo.OverridableConf;
-import org.apache.tajo.SessionVars;
-import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
@@ -36,8 +33,6 @@ import org.apache.tajo.util.datetime.DateTimeFormat;
 import org.apache.tajo.util.datetime.DateTimeUtil;
 import org.apache.tajo.util.datetime.TimeMeta;
 
-import java.util.TimeZone;
-
 import static org.apache.tajo.common.TajoDataTypes.Type.TEXT;
 import static org.apache.tajo.common.TajoDataTypes.Type.TIMESTAMP;
 
@@ -50,7 +45,6 @@ import static org.apache.tajo.common.TajoDataTypes.Type.TIMESTAMP;
   paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TIMESTAMP, TajoDataTypes.Type.TEXT})}
 )
 public class ToCharTimestamp extends GeneralFunction {
-  @Expose private TimeZone timezone;
 
   public ToCharTimestamp() {
     super(new Column[] {
@@ -61,8 +55,9 @@ public class ToCharTimestamp extends GeneralFunction {
 
   @Override
   public void init(OverridableConf context, FunctionEval.ParamType[] paramTypes) {
-    String timezoneId = context.get(SessionVars.TIMEZONE, TajoConstants.DEFAULT_SYSTEM_TIMEZONE);
-    timezone = TimeZone.getTimeZone(timezoneId);
+    if (!hasTimeZone()) {
+      setTimeZone(context.getConf().getSystemTimezone());
+    }
   }
 
   @Override
@@ -74,7 +69,7 @@ public class ToCharTimestamp extends GeneralFunction {
     TimeMeta tm = params.getTimeDate(0);
     String pattern = params.getText(1);
 
-    DateTimeUtil.toUserTimezone(tm, timezone);
+    DateTimeUtil.toUserTimezone(tm, getTimeZone());
 
     return DatumFactory.createText(DateTimeFormat.to_char(tm, pattern));
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestampText.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestampText.java b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestampText.java
index ff92795..5201f33 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestampText.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/function/datetime/ToTimestampText.java
@@ -19,22 +19,20 @@
 package org.apache.tajo.engine.function.datetime;
 
 import org.apache.tajo.OverridableConf;
-import org.apache.tajo.SessionVars;
-import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.common.TajoDataTypes;
-import org.apache.tajo.datum.*;
-import org.apache.tajo.plan.expr.FunctionEval;
-import org.apache.tajo.plan.function.GeneralFunction;
+import org.apache.tajo.datum.Datum;
+import org.apache.tajo.datum.NullDatum;
+import org.apache.tajo.datum.TimestampDatum;
 import org.apache.tajo.engine.function.annotation.Description;
 import org.apache.tajo.engine.function.annotation.ParamTypes;
+import org.apache.tajo.plan.expr.FunctionEval;
+import org.apache.tajo.plan.function.GeneralFunction;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.util.datetime.DateTimeFormat;
 import org.apache.tajo.util.datetime.DateTimeUtil;
 import org.apache.tajo.util.datetime.TimeMeta;
 
-import java.util.TimeZone;
-
 import static org.apache.tajo.common.TajoDataTypes.Type.TEXT;
 
 @Description(
@@ -47,15 +45,15 @@ import static org.apache.tajo.common.TajoDataTypes.Type.TEXT;
     paramTypes = {@ParamTypes(paramTypes = {TajoDataTypes.Type.TEXT, TajoDataTypes.Type.TEXT})}
 )
 public class ToTimestampText extends GeneralFunction {
-  private TimeZone timezone;
 
   public ToTimestampText() {
     super(new Column[]{new Column("DateTimeText", TEXT), new Column("Pattern", TEXT)});
   }
 
-  public void init(OverridableConf queryContext, FunctionEval.ParamType [] paramTypes) {
-    String timezoneId = queryContext.get(SessionVars.TIMEZONE, TajoConstants.DEFAULT_SYSTEM_TIMEZONE);
-    timezone = TimeZone.getTimeZone(timezoneId);
+  public void init(OverridableConf context, FunctionEval.ParamType [] paramTypes) {
+    if (!hasTimeZone()) {
+      setTimeZone(context.getConf().getSystemTimezone());
+    }
   }
 
   @Override
@@ -65,7 +63,7 @@ public class ToTimestampText extends GeneralFunction {
     }
 
     TimeMeta tm = DateTimeFormat.parseDateTime(params.getText(0), params.getText(1));
-    DateTimeUtil.toUTCTimezone(tm, timezone);
+    DateTimeUtil.toUTCTimezone(tm, getTimeZone());
 
     return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ColPartitionStoreExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ColPartitionStoreExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ColPartitionStoreExec.java
index 83a9ff8..0286340 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ColPartitionStoreExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ColPartitionStoreExec.java
@@ -75,7 +75,7 @@ public abstract class ColPartitionStoreExec extends UnaryPhysicalExec {
     if (this.plan.hasOptions()) {
       meta = CatalogUtil.newTableMeta(plan.getStorageType(), plan.getOptions());
     } else {
-      meta = CatalogUtil.newTableMeta(plan.getStorageType());
+      meta = CatalogUtil.newTableMeta(plan.getStorageType(), context.getConf());
     }
 
     PhysicalPlanUtil.setNullCharIfNecessary(context.getQueryContext(), plan, meta);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ExternalSortExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ExternalSortExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ExternalSortExec.java
index e269bf6..ae16667 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ExternalSortExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ExternalSortExec.java
@@ -138,7 +138,7 @@ public class ExternalSortExec extends SortExec {
     this.allocatedCoreNum = context.getConf().getIntVar(ConfVars.EXECUTOR_EXTERNAL_SORT_THREAD_NUM);
     this.localDirAllocator = new LocalDirAllocator(ConfVars.WORKER_TEMPORAL_DIR.varname);
     this.localFS = new RawLocalFileSystem();
-    this.intermediateMeta = CatalogUtil.newTableMeta(BuiltinStorages.DRAW);
+    this.intermediateMeta = CatalogUtil.newTableMeta(BuiltinStorages.DRAW, context.getConf());
     this.inputStats = new TableStats();
     this.sortAlgorithm = getSortAlgorithm(context.getQueryContext(), sortSpecs);
     LOG.info(sortAlgorithm.name() + " sort is selected");

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashShuffleFileWriteExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashShuffleFileWriteExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashShuffleFileWriteExec.java
index 5563ab9..0da1aa6 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashShuffleFileWriteExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/HashShuffleFileWriteExec.java
@@ -84,7 +84,7 @@ public final class HashShuffleFileWriteExec extends UnaryPhysicalExec {
     if (plan.hasOptions()) {
       this.meta = CatalogUtil.newTableMeta(plan.getStorageType(), plan.getOptions());
     } else {
-      this.meta = CatalogUtil.newTableMeta(plan.getStorageType());
+      this.meta = CatalogUtil.newTableMeta(plan.getStorageType(), context.getConf());
     }
     // about the shuffle
     this.numShuffleOutputs = this.plan.getNumOutputs();

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/InsertRowsExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/InsertRowsExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/InsertRowsExec.java
index 6c2f7a5..9648002 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/InsertRowsExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/InsertRowsExec.java
@@ -58,7 +58,7 @@ public class InsertRowsExec extends UnaryPhysicalExec {
     if (plan.hasOptions()) {
       meta = CatalogUtil.newTableMeta(plan.getStorageType(), plan.getOptions());
     } else {
-      meta = CatalogUtil.newTableMeta(plan.getStorageType());
+      meta = CatalogUtil.newTableMeta(plan.getStorageType(), context.getConf());
     }
 
     PhysicalPlanUtil.setNullCharIfNecessary(context.getQueryContext(), plan, meta);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/RangeShuffleFileWriteExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/RangeShuffleFileWriteExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/RangeShuffleFileWriteExec.java
index 776a783..c7e5bec 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/RangeShuffleFileWriteExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/RangeShuffleFileWriteExec.java
@@ -64,7 +64,7 @@ public class RangeShuffleFileWriteExec extends UnaryPhysicalExec {
     if (plan.hasOptions()) {
       this.meta = CatalogUtil.newTableMeta(plan.getStorageType(), plan.getOptions());
     } else {
-      this.meta = CatalogUtil.newTableMeta(plan.getStorageType());
+      this.meta = CatalogUtil.newTableMeta(plan.getStorageType(), context.getConf());
     }
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreTableExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreTableExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreTableExec.java
index 2ebad1e..08ecb95 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreTableExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreTableExec.java
@@ -66,7 +66,7 @@ public class StoreTableExec extends UnaryPhysicalExec {
     if (plan.hasOptions()) {
       meta = CatalogUtil.newTableMeta(plan.getStorageType(), plan.getOptions());
     } else {
-      meta = CatalogUtil.newTableMeta(plan.getStorageType());
+      meta = CatalogUtil.newTableMeta(plan.getStorageType(), context.getConf());
     }
 
     PhysicalPlanUtil.setNullCharIfNecessary(context.getQueryContext(), plan, meta);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/master/exec/CreateTableExecutor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/CreateTableExecutor.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/CreateTableExecutor.java
index a2b5ab9..55d5442 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/CreateTableExecutor.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/CreateTableExecutor.java
@@ -57,7 +57,7 @@ public class CreateTableExecutor {
     if (createTable.hasOptions()) {
       meta = CatalogUtil.newTableMeta(createTable.getStorageType(), createTable.getOptions());
     } else {
-      meta = CatalogUtil.newTableMeta(createTable.getStorageType());
+      meta = CatalogUtil.newTableMeta(createTable.getStorageType(), queryContext.getConf());
     }
 
     if(PlannerUtil.isFileStorageType(createTable.getStorageType()) && createTable.isExternal()){

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
index 1a51d98..f0a6b76 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
@@ -73,6 +73,7 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.TimeZone;
 
 import static org.apache.tajo.exception.ReturnStateUtil.OK;
 import static org.apache.tajo.exception.ReturnStateUtil.errUndefinedDatabase;
@@ -327,6 +328,11 @@ public class QueryExecutor {
     LogicalRootNode rootNode = plan.getRootBlock().getRoot();
 
     EvalContext evalContext = new EvalContext();
+
+    //Non From query should be session's time zone. e,g, select to_char(now(), 'yyyy-MM-dd')
+    String timezoneId = queryContext.get(SessionVars.TIMEZONE);
+    evalContext.setTimeZone(TimeZone.getTimeZone(timezoneId));
+
     List<Target> targets = plan.getRootBlock().getRawTargets();
     if (targets == null) {
       throw new TajoInternalError("no targets");

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java b/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java
index d56b6b4..47f1af2 100644
--- a/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java
+++ b/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java
@@ -120,6 +120,9 @@ public class TaskAttemptContext {
     this.partitionOutputVolume = Maps.newHashMap();
 
     this.partitions = new ArrayList<>();
+
+    // set to system timezone for forwarded query
+    this.evalContext.setTimeZone(queryContext.getConf().getSystemTimezone());
   }
 
   @VisibleForTesting

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-docs/src/main/sphinx/jdbc_driver.rst
----------------------------------------------------------------------
diff --git a/tajo-docs/src/main/sphinx/jdbc_driver.rst b/tajo-docs/src/main/sphinx/jdbc_driver.rst
index 176477a..41ad6f2 100644
--- a/tajo-docs/src/main/sphinx/jdbc_driver.rst
+++ b/tajo-docs/src/main/sphinx/jdbc_driver.rst
@@ -83,6 +83,7 @@ The connection parameters that Tajo currently supports are as follows:
  * ``connectTimeout = int (seconds)`` - The timeout value used for socket connect operations. If connecting to the server takes longer than this value, the connection is broken. The timeout is specified in seconds and a value of zero means that it is disabled.
  * ``socketTimeout = int (seconds)`` - The timeout value used for socket read operations. If reading from the server takes longer than this value, the connection is closed. This can be used as both a brute force global query timeout and a method of detecting network problems. The timeout is specified in seconds and a value of zero means that it is disabled.
  * ``retry = int`` - Number of retry operation. Tajo JDBC driver is resilient against some network or connection problems. It determines how many times the connection will retry.
+ * ``timezone = string (timezone id e,g, 'Asia/Tokyo')`` - Each connection has its own client time zone setting.
 
 
 An Example JDBC Client

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-docs/src/main/sphinx/time_zone.rst
----------------------------------------------------------------------
diff --git a/tajo-docs/src/main/sphinx/time_zone.rst b/tajo-docs/src/main/sphinx/time_zone.rst
index 9b86e18..1d6fb27 100644
--- a/tajo-docs/src/main/sphinx/time_zone.rst
+++ b/tajo-docs/src/main/sphinx/time_zone.rst
@@ -2,7 +2,7 @@
 Time Zone
 ******************
 
-Time zone affects some data types (e.g., ``Timestamp`` and ``Time``) and operations (e.g., ``to_char``). Tables can have different time zones. Internally, Tajo translates all table rows to UTC values and processes them. It becomes easier for Tajo to handle multiple different time zones.
+Time zone affects ``Timestamp`` data type and operations (e.g., ``to_char``). Tables can have different time zones. Internally, Tajo translates all table rows to UTC values and processes them. It becomes easier for Tajo to handle multiple different time zones.
 
 In Tajo, there are some time zong settings.
 
@@ -27,7 +27,7 @@ Table Time Zone
 ==================
 
 In Tajo, a table property ``timezone`` allows users to specify a time zone that the table uses for reading or writing. 
-When each table row are read or written, ```timestamp``` and ```time``` column values are adjusted by a given time zone if it is set.
+When each table row are read or written, ```timestamp``` column values are adjusted by a given time zone if it is set.
 
 You can specify a table time zone as follows:
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestResultSet.java
----------------------------------------------------------------------
diff --git a/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestResultSet.java b/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestResultSet.java
index 0e9b2a7..c04e3b2 100644
--- a/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestResultSet.java
+++ b/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestResultSet.java
@@ -23,11 +23,8 @@ package org.apache.tajo.jdbc;
 
 import com.google.protobuf.ByteString;
 import org.apache.hadoop.fs.Path;
-import org.apache.tajo.IntegrationTest;
-import org.apache.tajo.TajoConstants;
+import org.apache.tajo.*;
 import org.apache.tajo.TajoProtos.CodecType;
-import org.apache.tajo.TajoTestingCluster;
-import org.apache.tajo.TpchTestBase;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.client.TajoClient;
@@ -50,6 +47,7 @@ import java.nio.ByteBuffer;
 import java.sql.*;
 import java.util.Calendar;
 import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
 
 import static org.junit.Assert.*;
 
@@ -73,7 +71,8 @@ public class TestResultSet {
         .add("deptname", Type.TEXT)
         .add("score", Type.INT4)
         .build();
-    scoreMeta = CatalogUtil.newTableMeta("TEXT");
+
+    scoreMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     rowBlock = new MemoryRowBlock(SchemaUtil.toDataTypes(scoreSchema));
     TableStats stats = new TableStats();
 
@@ -240,7 +239,13 @@ public class TestResultSet {
       assertEquals(Timestamp.valueOf("2014-01-01 01:00:00"), timestamp);
 
       // assert with timezone
-      Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+9"));
+
+      //Current timezone + 1 hour
+      TimeZone tz = TimeZone.getDefault();
+      tz.setRawOffset(tz.getRawOffset() + (int) TimeUnit.HOURS.toMillis(1));
+
+      Calendar cal = Calendar.getInstance(tz);
+      assertEquals(tz.getRawOffset(), cal.getTimeZone().getRawOffset());
       date = res.getDate(1, cal);
       assertNotNull(date);
       assertEquals("2014-01-01", date.toString());
@@ -249,21 +254,21 @@ public class TestResultSet {
       assertNotNull(date);
       assertEquals("2014-01-01", date.toString());
 
-      time = res.getTime(2, cal);
+      time = res.getTime(2);
       assertNotNull(time);
-      assertEquals("10:00:00", time.toString());
+      assertEquals("01:00:00", time.toString());
 
-      time = res.getTime("col2", cal);
+      time = res.getTime("col2");
       assertNotNull(time);
-      assertEquals("10:00:00", time.toString());
+      assertEquals("01:00:00", time.toString());
 
       timestamp = res.getTimestamp(3, cal);
       assertNotNull(timestamp);
-      assertEquals("2014-01-01 10:00:00.0", timestamp.toString());
+      assertEquals("2014-01-01 02:00:00.0", timestamp.toString());
 
       timestamp = res.getTimestamp("col3", cal);
       assertNotNull(timestamp);
-      assertEquals("2014-01-01 10:00:00.0", timestamp.toString());
+      assertEquals("2014-01-01 02:00:00.0", timestamp.toString());
     } finally {
       if (res != null) {
         res.close();

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java
----------------------------------------------------------------------
diff --git a/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java b/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java
index fb1dd61..faaba71 100644
--- a/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java
+++ b/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java
@@ -681,4 +681,103 @@ public class TestTajoJdbc extends QueryTestCaseBase {
       }
     }
   }
+
+  @Test
+  public void testTableValueWithTimeZone() throws Exception {
+    String tableName = CatalogUtil.normalizeIdentifier("testTableValueWithTimeZone");
+
+    Statement stmt = null;
+    ResultSet res = null;
+    Connection conn = null;
+    try {
+      String connUri = buildConnectionUri(tajoMasterAddress.getHostName(), tajoMasterAddress.getPort(),
+          DEFAULT_DATABASE_NAME);
+      connUri = connUri + "?timezone=GMT";
+
+      conn = DriverManager.getConnection(connUri);
+      assertTrue(conn.isValid(100));
+
+      stmt = conn.createStatement();
+      stmt.executeUpdate("create table " + tableName + " (cdate timestamp)");
+      res = stmt.executeQuery("insert overwrite into " + tableName + " select TIMESTAMP '2016-04-01 00:00:00'");
+      cleanupQuery(res);
+
+      res = stmt.executeQuery("select * from " + tableName);
+      assertTrue(res.next());
+      assertEquals("2016-04-01 00:00:00", res.getString(1));
+      cleanupQuery(res);
+      stmt.close();
+      conn.close();
+
+
+      // set time zone ('Asia/Tokyo' offset +9)
+      connUri = buildConnectionUri(tajoMasterAddress.getHostName(), tajoMasterAddress.getPort(),
+          DEFAULT_DATABASE_NAME);
+      connUri = connUri + "?timezone=Asia/Tokyo";
+
+      conn = DriverManager.getConnection(connUri);
+      assertTrue(conn.isValid(100));
+
+      stmt = conn.createStatement();
+
+      res = stmt.executeQuery("select * from " + tableName);
+      assertTrue(res.next());
+      assertEquals("2016-04-01 09:00:00", res.getString(1));
+    } finally {
+      cleanupQuery(res);
+      if (stmt != null) {
+        stmt.close();
+      }
+
+      if(conn != null) {
+        conn.close();
+      }
+    }
+  }
+
+  @Test
+  public void testNonFromQueryWithTimeZone() throws Exception {
+    Statement stmt = null;
+    ResultSet res = null;
+    Connection conn = null;
+    try {
+      String connUri = buildConnectionUri(tajoMasterAddress.getHostName(), tajoMasterAddress.getPort(),
+          DEFAULT_DATABASE_NAME);
+      connUri = connUri + "?timezone=GMT";
+
+      conn = DriverManager.getConnection(connUri);
+      assertTrue(conn.isValid(100));
+
+      stmt = conn.createStatement();
+
+      res = stmt.executeQuery("select TIMESTAMP '2016-04-01 00:00:00'");
+      assertTrue(res.next());
+      assertEquals("2016-04-01 00:00:00", res.getString(1));
+      cleanupQuery(res);
+      stmt.close();
+      conn.close();
+
+      // set different timezone
+      connUri = buildConnectionUri(tajoMasterAddress.getHostName(), tajoMasterAddress.getPort(),
+          DEFAULT_DATABASE_NAME);
+      connUri = connUri + "?timezone=Asia/Tokyo";
+
+      conn = DriverManager.getConnection(connUri);
+      assertTrue(conn.isValid(100));
+
+      stmt = conn.createStatement();
+      res = stmt.executeQuery("select TIMESTAMP '2016-04-01 00:00:00'");
+      assertTrue(res.next());
+      assertEquals("2016-04-01 00:00:00", res.getString(1));
+    } finally {
+      cleanupQuery(res);
+      if (stmt != null) {
+        stmt.close();
+      }
+
+      if(conn != null) {
+        conn.close();
+      }
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java b/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java
index e87d33b..d5e9354 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/ExprAnnotator.java
@@ -21,9 +21,9 @@ package org.apache.tajo.plan;
 import com.google.common.collect.Sets;
 import org.apache.commons.collections.set.UnmodifiableSet;
 import org.apache.tajo.OverridableConf;
-import org.apache.tajo.SessionVars;
 import org.apache.tajo.algebra.*;
 import org.apache.tajo.catalog.*;
+import org.apache.tajo.catalog.CatalogUtil.Direction;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.*;
 import org.apache.tajo.exception.*;
@@ -120,10 +120,13 @@ public class ExprAnnotator extends BaseAlgebraVisitor<ExprAnnotator.Context, Eva
     Type toBeCasted = TUtil.getFromNestedMap(CatalogUtil.OPERATION_CASTING_MAP, lhsType, rhsType);
     if (toBeCasted != null) { // if not null, one of either should be converted to another type.
       // Overwrite lhs, rhs, or both with cast expression.
-      if (lhsType != toBeCasted) {
+
+      Direction direction = CatalogUtil.getCastingDirection(lhsType, rhsType);
+
+      if (lhsType != toBeCasted && (direction == Direction.BOTH || direction == Direction.LHS)) {
         lhs = convertType(ctx, lhs, CatalogUtil.newSimpleDataType(toBeCasted));
       }
-      if (rhsType != toBeCasted) {
+      if (rhsType != toBeCasted && (direction == Direction.BOTH || direction == Direction.RHS)) {
         rhs = convertType(ctx, rhs, CatalogUtil.newSimpleDataType(toBeCasted));
       }
     }
@@ -781,15 +784,9 @@ public class ExprAnnotator extends BaseAlgebraVisitor<ExprAnnotator.Context, Eva
       ConstEval constEval = (ConstEval) child;
 
       // some cast operation may require earlier evaluation with timezone.
-      TimeZone tz = null;
-      if (ctx.queryContext.containsKey(SessionVars.TIMEZONE)) {
-        String tzId = ctx.queryContext.get(SessionVars.TIMEZONE);
-        tz = TimeZone.getTimeZone(tzId);
-      }
-
       return new ConstEval(
           DatumFactory.cast(constEval.getValue(),
-              LogicalPlanner.convertDataType(expr.getTarget()).getDataType(), tz));
+              LogicalPlanner.convertDataType(expr.getTarget()).getDataType(), ctx.timeZone));
 
     } else {
       return new CastEval(ctx.queryContext, child, LogicalPlanner.convertDataType(expr.getTarget()).getDataType());
@@ -858,11 +855,7 @@ public class ExprAnnotator extends BaseAlgebraVisitor<ExprAnnotator.Context, Eva
 
     TimeMeta tm = new TimeMeta();
     DateTimeUtil.toJulianTimeMeta(timestamp, tm);
-
-    if (ctx.queryContext.containsKey(SessionVars.TIMEZONE)) {
-      TimeZone tz = TimeZone.getTimeZone(ctx.queryContext.get(SessionVars.TIMEZONE));
-      DateTimeUtil.toUTCTimezone(tm, tz);
-    }
+    DateTimeUtil.toUTCTimezone(tm, ctx.timeZone);
 
     return new ConstEval(new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm)));
   }
@@ -889,11 +882,6 @@ public class ExprAnnotator extends BaseAlgebraVisitor<ExprAnnotator.Context, Eva
     TimeDatum timeDatum = new TimeDatum(time);
     TimeMeta tm = timeDatum.asTimeMeta();
 
-    if (ctx.queryContext.containsKey(SessionVars.TIMEZONE)) {
-      TimeZone tz = TimeZone.getTimeZone(ctx.queryContext.get(SessionVars.TIMEZONE));
-      DateTimeUtil.toUTCTimezone(tm, tz);
-    }
-
     return new ConstEval(new TimeDatum(DateTimeUtil.toTime(tm)));
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
index f74e16f..5336906 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
@@ -103,10 +103,8 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
       this.evalOptimizer = evalOptimizer;
 
       // session's time zone
-      if (context.containsKey(SessionVars.TIMEZONE)) {
-        String timezoneId = context.get(SessionVars.TIMEZONE);
-        timeZone = TimeZone.getTimeZone(timezoneId);
-      }
+      String timezoneId = context.get(SessionVars.TIMEZONE);
+      this.timeZone = TimeZone.getTimeZone(timezoneId);
 
       this.debugOrUnitTests = debugOrUnitTests;
     }
@@ -1899,7 +1897,8 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
     }
 
     // Set default storage properties to table
-    createTableNode.setOptions(CatalogUtil.newDefaultProperty(createTableNode.getStorageType()));
+    createTableNode.setOptions(
+        CatalogUtil.newDefaultProperty(createTableNode.getStorageType(), context.getQueryContext().getConf()));
 
     // Priority to apply table properties
     // 1. Explicit table properties specified in WITH clause

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/TablePropertyUtil.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/TablePropertyUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/TablePropertyUtil.java
index 25bd5b4..71e82d4 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/TablePropertyUtil.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/TablePropertyUtil.java
@@ -21,6 +21,7 @@ package org.apache.tajo.plan;
 import org.apache.tajo.OverridableConf;
 import org.apache.tajo.SessionVars;
 import org.apache.tajo.catalog.TableMeta;
+import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.plan.logical.CreateTableNode;
 import org.apache.tajo.plan.logical.ScanNode;
 import org.apache.tajo.storage.StorageConstants;
@@ -65,8 +66,8 @@ public class TablePropertyUtil {
   public static void setTableProperty(OverridableConf context, ScanNode node) {
     TableMeta meta = node.getTableDesc().getMeta();
 
-    setProperty(context, SessionVars.TIMEZONE, meta, StorageConstants.TIMEZONE);
-    setProperty(context, SessionVars.NULL_CHAR, meta, StorageConstants.TEXT_NULL);
+    // set default time zone, if there is no table timezone
+    setProperty(context.getConf(), TajoConf.ConfVars.$TIMEZONE, meta, StorageConstants.TIMEZONE);
   }
 
   /**
@@ -86,4 +87,20 @@ public class TablePropertyUtil {
       meta.putProperty(propertyKey, context.get(sessionVarKey));
     }
   }
+
+  /**
+   * If there is no table property for the propertyKey, set default property from system conf to the table.
+   *
+   * @param conf TajoConf
+   * @param confVarKey system variable key
+   * @param meta TableMeta
+   * @param propertyKey table property key
+   */
+  private static void setProperty(TajoConf conf, TajoConf.ConfVars confVarKey,
+                                  TableMeta meta, String propertyKey) {
+
+    if (!meta.containsProperty(propertyKey)) {
+      meta.putProperty(propertyKey, conf.getVar(confVarKey));
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java
index 653eeb0..975b69e 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/CastEval.java
@@ -20,13 +20,13 @@ package org.apache.tajo.plan.expr;
 
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.OverridableConf;
-import org.apache.tajo.SessionVars;
+import org.apache.tajo.annotation.Nullable;
+import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TypeConverter;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.type.Type;
-import org.apache.tajo.util.TUtil;
 
 import java.util.TimeZone;
 
@@ -34,16 +34,11 @@ import static org.apache.tajo.common.TajoDataTypes.DataType;
 
 public class CastEval extends UnaryEval implements Cloneable {
   @Expose private DataType target;
-  @Expose private TimeZone timezone;
+  private TimeZone timezone;
 
   public CastEval(OverridableConf context, EvalNode operand, DataType target) {
     super(EvalType.CAST, operand);
     this.target = target;
-
-    if (context.containsKey(SessionVars.TIMEZONE)) {
-      String timezoneId = context.get(SessionVars.TIMEZONE);
-      timezone = TimeZone.getTimeZone(timezoneId);
-    }
   }
 
   public EvalNode getOperand() {
@@ -55,20 +50,20 @@ public class CastEval extends UnaryEval implements Cloneable {
     return TypeConverter.convert(target);
   }
 
-  public boolean hasTimeZone() {
-    return this.timezone != null;
-  }
-
-  public TimeZone getTimezone() {
-    return this.timezone;
-  }
-
   @Override
   public String getName() {
     return target.getType().name();
   }
 
   @Override
+  public EvalNode bind(@Nullable EvalContext evalContext, Schema schema) {
+    if (evalContext != null) {
+      timezone = evalContext.getTimeZone();
+    }
+    return super.bind(evalContext, schema);
+  }
+
+  @Override
   @SuppressWarnings("unchecked")
   public Datum eval(Tuple tuple) {
     super.eval(tuple);
@@ -89,7 +84,6 @@ public class CastEval extends UnaryEval implements Cloneable {
     final int prime = 31;
     int result = super.hashCode();
     result = prime * result + ((target == null) ? 0 : target.hashCode());
-    result = prime * result + ((timezone == null) ? 0 : timezone.hashCode());
     return result;
   }
 
@@ -100,8 +94,7 @@ public class CastEval extends UnaryEval implements Cloneable {
       CastEval another = (CastEval) obj;
       boolean b1 = child.equals(another.child);
       boolean b2 = target.equals(another.target);
-      boolean b3 = TUtil.checkEquals(timezone, another.timezone);
-      return b1 && b2 && b3;
+      return b1 && b2;
     } else {
       return false;
     }
@@ -113,9 +106,7 @@ public class CastEval extends UnaryEval implements Cloneable {
     if (target != null) {
       clone.target = target;
     }
-    if (timezone != null) {
-      clone.timezone = timezone;
-    }
+
     return clone;
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalContext.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalContext.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalContext.java
index e6099bc..9d287d4 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalContext.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalContext.java
@@ -23,9 +23,11 @@ import org.apache.tajo.plan.function.python.TajoScriptEngine;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.TimeZone;
 
 public class EvalContext {
   private final Map<EvalNode, TajoScriptEngine> scriptEngineMap = new HashMap<>();
+  private TimeZone timeZone;
 
   public void addScriptEngine(EvalNode evalNode, TajoScriptEngine scriptExecutor) {
     this.scriptEngineMap.put(evalNode, scriptExecutor);
@@ -43,4 +45,16 @@ public class EvalContext {
   public Collection<TajoScriptEngine> getAllScriptEngines() {
     return this.scriptEngineMap.values();
   }
+
+  public TimeZone getTimeZone() {
+    return timeZone;
+  }
+
+  public void setTimeZone(TimeZone timeZone) {
+    this.timeZone = timeZone;
+  }
+
+  public boolean hasTimeZone() {
+    return timeZone != null;
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalNode.java
index 665a770..8a501c0 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalNode.java
@@ -22,7 +22,6 @@ import com.google.gson.annotations.Expose;
 import org.apache.tajo.annotation.Nullable;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.ProtoObject;
-import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.plan.serder.EvalNodeSerializer;

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/GeneralFunctionEval.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/GeneralFunctionEval.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/GeneralFunctionEval.java
index febadc0..3f70397 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/GeneralFunctionEval.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/GeneralFunctionEval.java
@@ -44,8 +44,14 @@ public class GeneralFunctionEval extends FunctionEval {
     super.bind(evalContext, schema);
     try {
       this.funcInvoke = FunctionInvoke.newInstance(funcDesc);
-      if (evalContext != null && evalContext.hasScriptEngine(this)) {
-        this.invokeContext.setScriptEngine(evalContext.getScriptEngine(this));
+      if (evalContext != null) {
+        if (evalContext.hasScriptEngine(this)) {
+          this.invokeContext.setScriptEngine(evalContext.getScriptEngine(this));
+        }
+
+        if (evalContext.hasTimeZone()) {
+          this.invokeContext.setTimeZone(evalContext.getTimeZone());
+        }
       }
       this.funcInvoke.init(invokeContext);
     } catch (IOException e) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/exprrewrite/rules/ConstantFolding.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/exprrewrite/rules/ConstantFolding.java b/tajo-plan/src/main/java/org/apache/tajo/plan/exprrewrite/rules/ConstantFolding.java
index 96186d3..e026fa5 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/exprrewrite/rules/ConstantFolding.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/exprrewrite/rules/ConstantFolding.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.plan.exprrewrite.rules;
 
+import org.apache.tajo.SessionVars;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.plan.LogicalPlanner;
 import org.apache.tajo.plan.annotator.Prioritized;
@@ -27,10 +28,7 @@ import org.apache.tajo.plan.function.python.PythonScriptEngine;
 import org.apache.tajo.plan.function.python.TajoScriptEngine;
 
 import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.Stack;
+import java.util.*;
 
 @Prioritized(priority = 10)
 public class ConstantFolding extends SimpleEvalNodeVisitor<LogicalPlanner.PlanContext>
@@ -71,7 +69,12 @@ public class ConstantFolding extends SimpleEvalNodeVisitor<LogicalPlanner.PlanCo
 
     unaryEval.setChild(child);
     if (child.getType() == EvalType.CONST) {
-      unaryEval.bind(null, null);
+
+      // session's time zone
+      String timezoneId = context.getQueryContext().get(SessionVars.TIMEZONE);
+      EvalContext evalContext = new EvalContext();
+      evalContext.setTimeZone(TimeZone.getTimeZone(timezoneId));
+      unaryEval.bind(evalContext, null);
       return new ConstEval(unaryEval.eval(null));
     }
 
@@ -95,11 +98,15 @@ public class ConstantFolding extends SimpleEvalNodeVisitor<LogicalPlanner.PlanCo
     }
 
     if (constantOfAllDescendents && evalNode.getType() == EvalType.FUNCTION) {
+      EvalContext evalContext = new EvalContext();
+      // session's time zone
+      String timezoneId = context.getQueryContext().get(SessionVars.TIMEZONE);
+      evalContext.setTimeZone(TimeZone.getTimeZone(timezoneId));
+
       if (evalNode.getFuncDesc().getInvocation().hasPython()) {
         TajoScriptEngine executor = new PythonScriptEngine(evalNode.getFuncDesc());
         try {
           executor.start(context.getQueryContext().getConf());
-          EvalContext evalContext = new EvalContext();
           evalContext.addScriptEngine(evalNode, executor);
           evalNode.bind(evalContext, null);
           Datum funcRes = evalNode.eval(null);
@@ -109,7 +116,7 @@ public class ConstantFolding extends SimpleEvalNodeVisitor<LogicalPlanner.PlanCo
           throw new RuntimeException(e);
         }
       } else {
-        evalNode.bind(null, null);
+        evalNode.bind(evalContext, null);
         return new ConstEval(evalNode.eval(null));
       }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/function/ClassBasedScalarFunctionInvoke.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/function/ClassBasedScalarFunctionInvoke.java b/tajo-plan/src/main/java/org/apache/tajo/plan/function/ClassBasedScalarFunctionInvoke.java
index fcdb261..3b9a853 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/function/ClassBasedScalarFunctionInvoke.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/function/ClassBasedScalarFunctionInvoke.java
@@ -47,6 +47,7 @@ public class ClassBasedScalarFunctionInvoke extends FunctionInvoke implements Cl
 
   @Override
   public void init(FunctionInvokeContext context) {
+    function.setTimeZone(context.getTimeZone());
     function.init(context.getQueryContext(), context.getParamTypes());
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/function/FunctionInvokeContext.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/function/FunctionInvokeContext.java b/tajo-plan/src/main/java/org/apache/tajo/plan/function/FunctionInvokeContext.java
index fb8dcea..5f051b7 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/function/FunctionInvokeContext.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/function/FunctionInvokeContext.java
@@ -26,6 +26,7 @@ import org.apache.tajo.plan.function.python.TajoScriptEngine;
 import org.apache.tajo.util.TUtil;
 
 import java.util.Arrays;
+import java.util.TimeZone;
 
 /**
  * This class contains some metadata need to execute functions.
@@ -34,6 +35,7 @@ public class FunctionInvokeContext implements Cloneable {
   private OverridableConf queryContext;
   private FunctionEval.ParamType[] paramTypes;
   private TajoScriptEngine scriptEngine;
+  private TimeZone timeZone;
 
   public FunctionInvokeContext(@Nullable OverridableConf queryContext, FunctionEval.ParamType[] paramTypes) {
     this.queryContext = queryContext;
@@ -60,6 +62,14 @@ public class FunctionInvokeContext implements Cloneable {
     return scriptEngine;
   }
 
+  public TimeZone getTimeZone() {
+    return timeZone;
+  }
+
+  public void setTimeZone(TimeZone timeZone) {
+    this.timeZone = timeZone;
+  }
+
   @Override
   public int hashCode() {
     return Objects.hashCode(queryContext, Arrays.hashCode(paramTypes));

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/function/GeneralFunction.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/function/GeneralFunction.java b/tajo-plan/src/main/java/org/apache/tajo/plan/function/GeneralFunction.java
index 39db5c6..9f20489 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/function/GeneralFunction.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/function/GeneralFunction.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.plan.function;
 
+import com.google.gson.annotations.Expose;
 import org.apache.tajo.OverridableConf;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.json.CatalogGsonHelper;
@@ -28,8 +29,12 @@ import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.plan.expr.FunctionEval;
 import org.apache.tajo.storage.Tuple;
 
+import java.util.TimeZone;
+
 @Deprecated
 public abstract class GeneralFunction extends Function implements GsonObject {
+  @Expose
+  protected TimeZone timeZone;
   public GeneralFunction(Column[] definedArgs) {
     super(definedArgs);
   }
@@ -56,4 +61,16 @@ public abstract class GeneralFunction extends Function implements GsonObject {
   public CatalogProtos.FunctionType getFunctionType() {
     return CatalogProtos.FunctionType.GENERAL;
   }
+
+  public void setTimeZone(TimeZone timeZone) {
+    this.timeZone = timeZone;
+  }
+
+  public TimeZone getTimeZone() {
+    return timeZone;
+  }
+
+  public boolean hasTimeZone() {
+    return timeZone != null;
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java b/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java
index 2e2e7b5..dcaac0c 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/function/python/PythonScriptEngine.java
@@ -23,6 +23,7 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.catalog.proto.CatalogProtos;
@@ -40,6 +41,7 @@ import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.storage.VTuple;
 import org.apache.tajo.unit.StorageUnit;
 import org.apache.tajo.util.FileUtil;
+import org.apache.tajo.util.TUtil;
 
 import java.io.*;
 import java.net.URI;
@@ -269,7 +271,7 @@ public class PythonScriptEngine extends TajoScriptEngine {
     FUNCTION_TYPE,
   }
 
-  private Configuration systemConf;
+  private TajoConf systemConf;
 
   private Process process; // Handle to the external execution of python functions
 
@@ -287,7 +289,7 @@ public class PythonScriptEngine extends TajoScriptEngine {
   private int[] projectionCols;
 
   private final CSVLineSerDe lineSerDe = new CSVLineSerDe();
-  private final TableMeta pipeMeta = CatalogUtil.newTableMeta("TEXT");
+  private TableMeta pipeMeta;
 
   private final Tuple EMPTY_INPUT = new VTuple(0);
   private final Schema EMPTY_SCHEMA = SchemaBuilder.builder().build();
@@ -313,8 +315,9 @@ public class PythonScriptEngine extends TajoScriptEngine {
   }
 
   @Override
-  public void start(Configuration systemConf) throws IOException {
-    this.systemConf = systemConf;
+  public void start(Configuration conf) throws IOException {
+    this.systemConf = TUtil.checkTypeAndGet(conf, TajoConf.class);
+    this.pipeMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, systemConf);
     startUdfController();
     setStreams();
     createInputHandlers();


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

Posted by jh...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/codegen/TestEvalCodeGenerator.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/codegen/TestEvalCodeGenerator.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/codegen/TestEvalCodeGenerator.java
index adbfd48..27ad24b 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/codegen/TestEvalCodeGenerator.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/codegen/TestEvalCodeGenerator.java
@@ -82,28 +82,28 @@ public class TestEvalCodeGenerator extends ExprTestBase {
         .add("nullable", TajoDataTypes.Type.NULL_TYPE)
         .build();
 
-    testEval(schema, "table1", ",1,2,3,4.5,6.5,F6,abc,abc,t", "select col0 is null from table1;", new String [] {"t"});
-    testEval(schema, "table1", "0,,2,3,4.5,6.5,F6,abc,abc,t,", "select col1 is null from table1;", new String [] {"t"});
-    testEval(schema, "table1", "0,1,,3,4.5,6.5,F6,abc,abc,t,", "select col2 is null from table1;", new String [] {"t"});
-    testEval(schema, "table1", "0,1,2,,4.5,6.5,F6,abc,abc,t,", "select col3 is null from table1;", new String [] {"t"});
-    testEval(schema, "table1", "0,1,2,3,,6.5,F6,abc,abc,t,", "select col4 is null from table1;", new String [] {"t"});
-    testEval(schema, "table1", "0,1,2,3,4.5,,F6,abc,abc,t,", "select col5 is null from table1;", new String [] {"t"});
-    testEval(schema, "table1", "0,1,2,3,4.5,6.5,,abc,abc,t,", "select col6 is null from table1;", new String [] {"t"});
-    testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,,abc,t,", "select col7 is null from table1;", new String[]{"t"});
-    testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,abc,,t,", "select col8 is null from table1;", new String [] {"t"});
-    testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,abc,abc,,", "select col9 is null from table1;", new String [] {"t"});
+    testEval(schema, "table1", "\\NULL,1,2,3,4.5,6.5,F6,abc,abc,t", "select col0 is null from table1;", new String [] {"t"});
+    testEval(schema, "table1", "0,\\NULL,2,3,4.5,6.5,F6,abc,abc,t,", "select col1 is null from table1;", new String [] {"t"});
+    testEval(schema, "table1", "0,1,\\NULL,3,4.5,6.5,F6,abc,abc,t,", "select col2 is null from table1;", new String [] {"t"});
+    testEval(schema, "table1", "0,1,2,\\NULL,4.5,6.5,F6,abc,abc,t,", "select col3 is null from table1;", new String [] {"t"});
+    testEval(schema, "table1", "0,1,2,3,\\NULL,6.5,F6,abc,abc,t,", "select col4 is null from table1;", new String [] {"t"});
+    testEval(schema, "table1", "0,1,2,3,4.5,\\NULL,F6,abc,abc,t,", "select col5 is null from table1;", new String [] {"t"});
+    testEval(schema, "table1", "0,1,2,3,4.5,6.5,\\NULL,abc,abc,t,", "select col6 is null from table1;", new String [] {"t"});
+    testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,\\NULL,abc,t,", "select col7 is null from table1;", new String[]{"t"});
+    testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,abc,\\NULL,t,", "select col8 is null from table1;", new String [] {"t"});
+    testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,abc,abc,\\NULL,", "select col9 is null from table1;", new String [] {"t"});
     testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,abc,abc,t,", "select nullable is null from table1;", new String [] {"t"});
 
-    testEval(schema, "table1", ",1,2,3,4.5,6.5,F6,abc,abc,t", "select col0 is not null from table1;", new String [] {"f"});
-    testEval(schema, "table1", "0,,2,3,4.5,6.5,F6,abc,abc,t,", "select col1 is not null from table1;", new String [] {"f"});
-    testEval(schema, "table1", "0,1,,3,4.5,6.5,F6,abc,abc,t,", "select col2 is not null from table1;", new String [] {"f"});
-    testEval(schema, "table1", "0,1,2,,4.5,6.5,F6,abc,abc,t,", "select col3 is not null from table1;", new String [] {"f"});
-    testEval(schema, "table1", "0,1,2,3,,6.5,F6,abc,abc,t,", "select col4 is not null from table1;", new String [] {"f"});
-    testEval(schema, "table1", "0,1,2,3,4.5,,F6,abc,abc,t,", "select col5 is not null from table1;", new String [] {"f"});
-    testEval(schema, "table1", "0,1,2,3,4.5,6.5,,abc,abc,t,", "select col6 is not null from table1;", new String [] {"f"});
-    testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,,abc,t,", "select col7 is not null from table1;", new String [] {"f"});
-    testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,abc,,t,", "select col8 is not null from table1;", new String [] {"f"});
-    testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,abc,abc,,", "select col9 is not null from table1;", new String [] {"f"});
+    testEval(schema, "table1", "\\NULL,1,2,3,4.5,6.5,F6,abc,abc,t", "select col0 is not null from table1;", new String [] {"f"});
+    testEval(schema, "table1", "0,\\NULL,2,3,4.5,6.5,F6,abc,abc,t,", "select col1 is not null from table1;", new String [] {"f"});
+    testEval(schema, "table1", "0,1,\\NULL,3,4.5,6.5,F6,abc,abc,t,", "select col2 is not null from table1;", new String [] {"f"});
+    testEval(schema, "table1", "0,1,2,\\NULL,4.5,6.5,F6,abc,abc,t,", "select col3 is not null from table1;", new String [] {"f"});
+    testEval(schema, "table1", "0,1,2,3,\\NULL,6.5,F6,abc,abc,t,", "select col4 is not null from table1;", new String [] {"f"});
+    testEval(schema, "table1", "0,1,2,3,4.5,\\NULL,F6,abc,abc,t,", "select col5 is not null from table1;", new String [] {"f"});
+    testEval(schema, "table1", "0,1,2,3,4.5,6.5,\\NULL,abc,abc,t,", "select col6 is not null from table1;", new String [] {"f"});
+    testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,\\NULL,abc,t,", "select col7 is not null from table1;", new String [] {"f"});
+    testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,abc,\\NULL,t,", "select col8 is not null from table1;", new String [] {"f"});
+    testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,abc,abc,\\NULL,", "select col9 is not null from table1;", new String [] {"f"});
     testEval(schema, "table1", "0,1,2,3,4.5,6.5,F6,abc,abc,t,", "select nullable is not null from table1;", new String [] {"f"});
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java
index 00fa590..38911c4 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/ExprTestBase.java
@@ -18,10 +18,9 @@
 
 package org.apache.tajo.engine.eval;
 
-import org.apache.tajo.LocalTajoTestingUtility;
-import org.apache.tajo.OverridableConf;
-import org.apache.tajo.SessionVars;
-import org.apache.tajo.TajoTestingCluster;
+import io.netty.buffer.Unpooled;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.tajo.*;
 import org.apache.tajo.algebra.Expr;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.cli.tsql.InvalidStatementException;
@@ -52,13 +51,10 @@ import org.apache.tajo.plan.serder.PlanProto;
 import org.apache.tajo.plan.verifier.LogicalPlanVerifier;
 import org.apache.tajo.plan.verifier.PreLogicalPlanVerifier;
 import org.apache.tajo.plan.verifier.VerificationState;
-import org.apache.tajo.storage.LazyTuple;
-import org.apache.tajo.storage.TablespaceManager;
-import org.apache.tajo.storage.Tuple;
-import org.apache.tajo.storage.VTuple;
-import org.apache.tajo.util.BytesUtils;
+import org.apache.tajo.storage.*;
+import org.apache.tajo.storage.text.CSVLineSerDe;
+import org.apache.tajo.storage.text.TextLineDeserializer;
 import org.apache.tajo.util.CommonTestingUtil;
-import org.apache.tajo.util.KeyValueSet;
 import org.apache.tajo.util.datetime.DateTimeUtil;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -85,7 +81,7 @@ public class ExprTestBase {
   private static LogicalPlanVerifier annotatedPlanVerifier;
 
   public static String getUserTimeZoneDisplay(TimeZone tz) {
-    return DateTimeUtil.getTimeZoneDisplayTime(tz);
+    return DateTimeUtil.getDisplayTimeZoneOffset(tz, false);
   }
 
   public ExprTestBase() {
@@ -217,53 +213,47 @@ public class ExprTestBase {
     if (context == null) {
       queryContext = LocalTajoTestingUtility.createDummyContext(conf);
     } else {
-      queryContext = LocalTajoTestingUtility.createDummyContext(conf);
+      queryContext = LocalTajoTestingUtility.createDummyContext(context.getConf());
       queryContext.putAll(context);
     }
 
-    String timezoneId = queryContext.get(SessionVars.TIMEZONE);
-    TimeZone timeZone = TimeZone.getTimeZone(timezoneId);
-
-    LazyTuple lazyTuple;
     VTuple vtuple  = null;
     String qualifiedTableName =
         CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME,
             tableName != null ? CatalogUtil.normalizeIdentifier(tableName) : null);
     Schema inputSchema = null;
+
+
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, queryContext.getConf());
+    meta.putProperty(StorageConstants.TEXT_DELIMITER, StringEscapeUtils.escapeJava(delimiter+""));
+    meta.putProperty(StorageConstants.TEXT_NULL, StringEscapeUtils.escapeJava("\\NULL"));
+
+    String timezoneId = queryContext.get(SessionVars.TIMEZONE);
+    TimeZone timeZone = TimeZone.getTimeZone(timezoneId);
+
     if (schema != null) {
       inputSchema = SchemaUtil.clone(schema);
       inputSchema.setQualifier(qualifiedTableName);
 
-      int targetIdx [] = new int[inputSchema.size()];
-      for (int i = 0; i < targetIdx.length; i++) {
-        targetIdx[i] = i;
+      try {
+        cat.createTable(CatalogUtil.newTableDesc(
+            qualifiedTableName, inputSchema, meta, CommonTestingUtil.getTestDir()));
+      } catch (IOException e) {
+        throw new TajoInternalError(e);
       }
 
-      byte[][] tokens = BytesUtils.splitPreserveAllTokens(
-          csvTuple.getBytes(), delimiter, targetIdx, inputSchema.size());
-      lazyTuple = new LazyTuple(inputSchema, tokens,0);
+      CSVLineSerDe serDe = new CSVLineSerDe();
+      TextLineDeserializer deserializer = serDe.createDeserializer(inputSchema, meta, inputSchema.toArray());
+      deserializer.init();
+
       vtuple = new VTuple(inputSchema.size());
-      for (int i = 0; i < inputSchema.size(); i++) {
-
-        // If null value occurs, null datum is manually inserted to an input tuple.
-        boolean nullDatum;
-        Datum datum = lazyTuple.get(i);
-        nullDatum = (datum instanceof TextDatum || datum instanceof CharDatum);
-        nullDatum = nullDatum &&
-            datum.asChars().equals("") || datum.asChars().equals(queryContext.get(SessionVars.NULL_CHAR));
-        nullDatum |= datum.isNull();
-
-        if (nullDatum) {
-          vtuple.put(i, NullDatum.get());
-        } else {
-          vtuple.put(i, lazyTuple.get(i));
-        }
-      }
+
       try {
-        cat.createTable(new TableDesc(qualifiedTableName, inputSchema,"TEXT",
-            new KeyValueSet(), CommonTestingUtil.getTestDir().toUri()));
-      } catch (IOException e) {
+        deserializer.deserialize(Unpooled.wrappedBuffer(csvTuple.getBytes()), vtuple);
+      } catch (Exception e) {
         throw new TajoInternalError(e);
+      } finally {
+        deserializer.release();
       }
     }
 
@@ -271,6 +261,7 @@ public class ExprTestBase {
 
     TajoClassLoader classLoader = new TajoClassLoader();
     EvalContext evalContext = new EvalContext();
+    evalContext.setTimeZone(timeZone);
 
     try {
       if (needPythonFileCopy()) {
@@ -306,8 +297,6 @@ public class ExprTestBase {
         String outTupleAsChars;
         if (outTuple.type(i) == Type.TIMESTAMP) {
           outTupleAsChars = TimestampDatum.asChars(outTuple.getTimeDate(i), timeZone, false);
-        } else if (outTuple.type(i) == Type.TIME) {
-          outTupleAsChars = TimeDatum.asChars(outTuple.getTimeDate(i), timeZone, false);
         } else {
           outTupleAsChars = outTuple.asDatum(i).toString();
         }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java
index 2846f22..a0cb924 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTreeUtil.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.eval;
 
 import com.google.common.collect.Sets;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.TajoTestingCluster;
@@ -103,7 +104,7 @@ public class TestEvalTreeUtil {
         .add("age", TajoDataTypes.Type.INT4)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     TableDesc desc = new TableDesc(
         CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, "people"), schema, meta,
         CommonTestingUtil.getTestDir().toUri());

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestPredicates.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestPredicates.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestPredicates.java
index cc9da7f..32403b3 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestPredicates.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestPredicates.java
@@ -295,7 +295,7 @@ public class TestPredicates extends ExprTestBase {
         .build();
 
     testEval(schema2, "table1", "a,b,c", "select col1 in ('a'), col2 in ('a', 'c') from table1", new String[]{"t","f"});
-    testEval(schema2, "table1", "a,,c", "select col1 in ('a','b','c'), (col2 in ('a', 'c')) is null from table1",
+    testEval(schema2, "table1", "a,\\NULL,c", "select col1 in ('a','b','c'), (col2 in ('a', 'c')) is null from table1",
         new String[]{"t","t"});
 
     testEval(schema2,
@@ -307,7 +307,7 @@ public class TestPredicates extends ExprTestBase {
     // null handling test
     testEval(schema2,
         "table1",
-        "2014-03-21,,2015-04-01",
+        "2014-03-21,\\NULL,2015-04-01",
         "select (substr(col2,1,4)::int4 in (2014,2015,2016)) is null from table1",
         new String[]{"t"});
   }
@@ -355,10 +355,10 @@ public class TestPredicates extends ExprTestBase {
         .add("col1", TEXT)
         .add("col2", TEXT)
         .build();
-    testEval(schema2, "table1", "_123,", "select ltrim(col1, '_') is null, upper(col2) is null as a from table1",
+    testEval(schema2, "table1", "_123,\\NULL", "select ltrim(col1, '_') is null, upper(col2) is null as a from table1",
         new String[]{"f", "t"});
 
-    testEval(schema2, "table1", "_123,",
+    testEval(schema2, "table1", "_123,\\NULL",
         "select ltrim(col1, '_') is not null, upper(col2) is not null as a from table1", new String[]{"t", "f"});
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java
index 293b02a..f2fb792 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestSQLExpression.java
@@ -26,14 +26,15 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.TimestampDatum;
 import org.apache.tajo.engine.query.QueryContext;
+import org.apache.tajo.exception.InvalidOperationException;
 import org.apache.tajo.exception.TajoException;
 import org.apache.tajo.exception.UndefinedFunctionException;
-import org.apache.tajo.util.datetime.DateTimeUtil;
 import org.junit.Test;
 
 import java.util.TimeZone;
 
 import static org.apache.tajo.common.TajoDataTypes.Type.*;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 public class TestSQLExpression extends ExprTestBase {
@@ -817,8 +818,6 @@ public class TestSQLExpression extends ExprTestBase {
   @Test
   public void testCastFromTable() throws TajoException {
     QueryContext queryContext = new QueryContext(getConf());
-    queryContext.put(SessionVars.TIMEZONE, "GMT-6");
-    TimeZone tz = TimeZone.getTimeZone("GMT-6");
 
     Schema schema = SchemaBuilder.builder()
         .add("col1", TEXT)
@@ -833,16 +832,12 @@ public class TestSQLExpression extends ExprTestBase {
     testEval(queryContext, schema, "table1", "123,234", "select col1::float, col2::float from table1",
         new String[]{"123.0", "234.0"});
 
-    TimestampDatum timestamp = DatumFactory.createTimestamp("1980-04-01 01:50:01" +
-        DateTimeUtil.getTimeZoneDisplayTime(tz));
-
     testEval(queryContext, schema, "table1", "1980-04-01 01:50:01,234",
         "select col1::timestamp as t1, col2::float from table1 where t1 = '1980-04-01 01:50:01'::timestamp",
-        new String[]{TimestampDatum.asChars(timestamp.asTimeMeta(), tz, false), "234.0"}
+        new String[]{"1980-04-01 01:50:01", "234.0"}
     );
 
-    testSimpleEval("select '1980-04-01 01:50:01'::timestamp;", new String[]{
-        TimestampDatum.asChars(timestamp.asTimeMeta(), tz, false)});
+    testSimpleEval("select '1980-04-01 01:50:01'::timestamp;", new String[]{"1980-04-01 01:50:01"});
     testSimpleEval("select '1980-04-01 01:50:01'::timestamp::text", new String[]{"1980-04-01 01:50:01"});
 
     testSimpleEval("select (cast ('99999'::int8 as text))::int4 + 1", new String[]{"100000"});
@@ -950,4 +945,81 @@ public class TestSQLExpression extends ExprTestBase {
     testSimpleEval("select (false OR 1 > null) is null", new String[] {"t"}); // false - unknown -> unknown
     testSimpleEval("select (false OR false)", new String[] {"f"}); // false - false -> false
   }
+
+  @Test
+  public void testInvalidOperation() throws TajoException {
+    testEvalException("select '1980-09-04'::date + '1980-09-04 00:10:10'::timestamp", InvalidOperationException.class);
+    testEvalException("select '1980-09-04 00:10:10'::timestamp + '1980-09-04'::date", InvalidOperationException.class);
+
+    testEvalException("select time '00:00' + time '02:00'", InvalidOperationException.class);
+    testEvalException("select time '00:00' - '1980-09-04'::date", InvalidOperationException.class);
+    testEvalException("select time '00:00' - '1980-09-04 00:10:10'::timestamp", InvalidOperationException.class);
+    testEvalException("select interval '1 day' - '1980-09-04 00:10:10'::timestamp", InvalidOperationException.class);
+
+    //TODO this operation should be allowed after timestamptz added
+    testEvalException("select date '1980-09-04' < timestamp '1980-09-04 00:00:01'", InvalidOperationException.class);
+    testEvalException("select date '1980-09-04' > timestamp '1980-09-04 00:00:01'", InvalidOperationException.class);
+    testEvalException("select date '1980-09-04' = timestamp '1980-09-04 00:00:01'", InvalidOperationException.class);
+    testEvalException("select '1980-09-04 00:10:10'::timestamp - '1980-09-04'::date", InvalidOperationException.class);
+    testEvalException("select '1980-09-04'::date - '1980-09-04 00:10:10'::timestamp", InvalidOperationException.class);
+  }
+
+  @Test
+  public void testArithmeticOperandForDateTime() throws TajoException {
+    Schema schema = SchemaBuilder.builder()
+        .add("col0", TIME)
+        .add("col1", DATE)
+        .add("col2", TIMESTAMP)
+        .build();
+
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col0 + col1 from table1;", new String[]{"1980-09-04 01:00:00"});
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col0 + col2 from table1;", new String[]{"1980-09-04 02:00:00"});
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col0 + interval '1 hour' from table1;", new String[]{"02:00:00"});
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select interval '1 hour' + col0 from table1;", new String[]{"02:00:00"});
+
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col1 + interval '1 day' from table1;", new String[]{"1980-09-05 00:00:00"});
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select interval '1 day' + col1 from table1;", new String[]{"1980-09-05 00:00:00"});
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col1 + col0 from table1;", new String[]{"1980-09-04 01:00:00"});
+
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col2 + (interval '1 day' + interval '1 hour') from table1;", new String[]{"1980-09-05 02:00:00"});
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select (interval '1 day' + interval '1 hour') + col2 from table1;", new String[]{"1980-09-05 02:00:00"});
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col2 + col0 from table1;", new String[]{"1980-09-04 02:00:00"});
+
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col0 - col0 from table1;", new String[]{"00:00:00"});
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col1 - col1 from table1;", new String[]{"0"});
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col2 - col2 from table1;", new String[]{"00:00:00"});
+
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col0 - interval '1 hour' from table1;", new String[]{"00:00:00"});
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col1 - interval '1 day' from table1;", new String[]{"1980-09-03 00:00:00"});
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col1 - col0 from table1;", new String[]{"1980-09-03 23:00:00"});
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col2 - (interval '1 day' + interval '1 hour') from table1;", new String[]{"1980-09-03 00:00:00"});
+    testEval(schema, "table1", "01:00:00,1980-09-04,1980-09-04 01:00:00",
+        "select col2 - col0 from table1;", new String[]{"1980-09-04 00:00:00"});
+  }
+
+  private <T extends Throwable> void testEvalException(String query, Class<T> clazz) {
+    try {
+      testSimpleEval(query, new String[]{""});
+      fail(query);
+    } catch (Throwable e) {
+      assertEquals(e.getMessage(), clazz, e.getClass());
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestConditionalExpressions.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestConditionalExpressions.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestConditionalExpressions.java
index 20045ad..8d3a94a 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestConditionalExpressions.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestConditionalExpressions.java
@@ -69,7 +69,7 @@ public class TestConditionalExpressions extends ExprTestBase {
     testEval(schema, "table1", "str1,str2",
         "SELECT CASE WHEN col1 IS NOT NULL THEN col2 ELSE NULL END FROM table1",
         new String[]{"str2"});
-    testEval(schema, "table1", ",str2",
+    testEval(schema, "table1", "\\NULL,str2",
         "SELECT CASE WHEN col1 IS NOT NULL THEN col2 ELSE NULL END FROM table1",
         new String[]{NullDatum.get().toString()});
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestDateTimeFunctions.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestDateTimeFunctions.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestDateTimeFunctions.java
index 3682006..bf997f3 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestDateTimeFunctions.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestDateTimeFunctions.java
@@ -22,8 +22,6 @@ package org.apache.tajo.engine.function;
 import org.apache.tajo.SessionVars;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.SchemaBuilder;
-import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.datum.TimestampDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
@@ -31,8 +29,8 @@ import org.apache.tajo.util.datetime.DateTimeUtil;
 import org.apache.tajo.util.datetime.TimeMeta;
 import org.junit.Test;
 
-import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.TimeZone;
 
 import static org.apache.tajo.common.TajoDataTypes.Type.*;
@@ -40,12 +38,12 @@ import static org.apache.tajo.common.TajoDataTypes.Type.*;
 public class TestDateTimeFunctions extends ExprTestBase {
   @Test
   public void testToTimestamp() throws TajoException {
-    long expectedTimestamp = System.currentTimeMillis();
-    TimestampDatum expected = DatumFactory.createTimestampDatumWithUnixTime((int)(expectedTimestamp/ 1000));
 
-    // (expectedTimestamp / 1000) means the translation from millis seconds to unix timestamp
-    String q1 = String.format("select to_timestamp(%d);", (expectedTimestamp / 1000));
-    testSimpleEval(q1, new String[]{expected.toString()});
+    QueryContext context = new QueryContext(getConf());
+    context.put(SessionVars.TIMEZONE, "GMT+9");
+
+    String q1 = String.format("select to_timestamp(%d);", 1389071574);
+    testSimpleEval(context, q1, new String[]{"2014-01-07 14:12:54"});
 
     testSimpleEval("select to_timestamp('1997-12-30 11:40:50.345', 'YYYY-MM-DD HH24:MI:SS.MS');",
         new String[]{"1997-12-30 11:40:50.345"});
@@ -236,9 +234,6 @@ public class TestDateTimeFunctions extends ExprTestBase {
 
   @Test
   public void testDatePart() throws TajoException {
-    TimeZone GMT = TimeZone.getTimeZone("GMT");
-    TimeZone PST = TimeZone.getTimeZone("PST");
-
     Schema schema2 = SchemaBuilder.builder()
         .add("col1", TIMESTAMP).build();
 
@@ -247,11 +242,11 @@ public class TestDateTimeFunctions extends ExprTestBase {
         "select date_part('year', col1), date_part('month', col1), date_part('day', col1) from table1;",
         new String[]{"1970.0", "1.0", "17.0"});
     testEval(schema2, "table1",
-        "1970-01-17 22:09:37" + getUserTimeZoneDisplay(GMT),
+        "1970-01-17 22:09:37-00",
         "select date_part('year', col1), date_part('month', col1), date_part('day', col1) from table1;",
         new String[]{"1970.0", "1.0", "17.0"});
     testEval(schema2, "table1",
-        "1970-01-17 22:09:37" + getUserTimeZoneDisplay(PST),
+        "1970-01-17 22:09:37-04",
         "select date_part('year', col1), date_part('month', col1), date_part('day', col1) from table1;",
         new String[]{"1970.0", "1.0", "18.0"});
 
@@ -261,12 +256,12 @@ public class TestDateTimeFunctions extends ExprTestBase {
     testEval(schema3, "table1", "10:09:37.5",
         "select date_part('hour', col1), date_part('minute', col1), date_part('second', col1) from table1;",
         new String[]{"10.0", "9.0", "37.5"});
-    testEval(schema3, "table1", "10:09:37.5" + getUserTimeZoneDisplay(GMT),
+    testEval(schema3, "table1", "10:09:37.5",
         "select date_part('hour', col1), date_part('minute', col1), date_part('second', col1) from table1;",
         new String[]{"10.0", "9.0", "37.5"});
-    testEval(schema3, "table1", "10:09:37.5" + getUserTimeZoneDisplay(PST),
+    testEval(schema3, "table1", "10:09:37.5",
         "select date_part('hour', col1), date_part('minute', col1), date_part('second', col1) from table1;",
-        new String[]{"18.0", "9.0", "37.5"});
+        new String[]{"10.0", "9.0", "37.5"});
 
     Schema schema4 = SchemaBuilder.builder()
         .add("col1", DATE)
@@ -431,59 +426,43 @@ public class TestDateTimeFunctions extends ExprTestBase {
 
   @Test
   public void testDateTimeNow() throws TajoException {
-    TimeZone originalTimezone = TimeZone.getDefault();
-    TimeZone.setDefault(TimeZone.getTimeZone("GMT-6"));
-
     QueryContext context = new QueryContext(getConf());
-    context.put(SessionVars.TIMEZONE, "GMT-6");
+    context.put(SessionVars.TIMEZONE, "America/Los_Angeles");
+
+    ZonedDateTime zonedDateTime = ZonedDateTime.now(TimeZone.getTimeZone(context.get(SessionVars.TIMEZONE)).toZoneId());
 
-    try {
-      Date expectedDate = new Date(System.currentTimeMillis());
-
-      testSimpleEval(context, "select to_char(now(), 'yyyy-MM-dd');",
-          new String[]{dateFormat(expectedDate, "yyyy-MM-dd")});
-      testSimpleEval(context, "select cast(extract(year from now()) as INT4);",
-          new String[]{dateFormat(expectedDate, "yyyy")});
-      testSimpleEval(context, "select current_date();",
-          new String[]{dateFormat(expectedDate, "yyyy-MM-dd")});
-      testSimpleEval(context, "select cast(extract(hour from current_time()) as INT4);",
-          new String[]{String.valueOf(Integer.parseInt(dateFormat(expectedDate, "HH")))});
-
-      expectedDate.setDate(expectedDate.getDate() + 1);
-
-      testSimpleEval(context, "select current_date() + 1;",
-          new String[]{dateFormat(expectedDate, "yyyy-MM-dd")});
-    } finally {
-      TimeZone.setDefault(originalTimezone);
-    }
+    testSimpleEval(context, "select to_char(now(), 'yyyy-MM-dd');",
+        new String[]{dateFormat(zonedDateTime, "yyyy-MM-dd")});
+    testSimpleEval(context, "select cast(extract(year from now()) as INT4);",
+        new String[]{dateFormat(zonedDateTime, "yyyy")});
+    testSimpleEval(context, "select current_date();",
+        new String[]{dateFormat(zonedDateTime, "yyyy-MM-dd")});
+    testSimpleEval(context, "select cast(extract(hour from current_time()) as INT4);",
+        new String[]{String.valueOf(Integer.parseInt(dateFormat(zonedDateTime, "HH")))});
+
+    zonedDateTime = zonedDateTime.plusDays(1);
+    testSimpleEval(context, "select current_date() + 1;", new String[]{dateFormat(zonedDateTime, "yyyy-MM-dd")});
   }
 
   @Test
   public void testTimeValueKeyword() throws TajoException {
-    TimeZone originTimeZone = TimeZone.getDefault();
-    TimeZone.setDefault(TimeZone.getTimeZone("GMT-6"));
 
     QueryContext context = new QueryContext(getConf());
     context.put(SessionVars.TIMEZONE, "GMT-6");
 
-    try {
-      Date expectedDate = new Date(System.currentTimeMillis());
-
-      testSimpleEval(context, "select to_char(current_timestamp, 'yyyy-MM-dd');",
-          new String[]{dateFormat(expectedDate, "yyyy-MM-dd")});
-      testSimpleEval(context, "select cast(extract(year from current_timestamp) as INT4);",
-          new String[]{dateFormat(expectedDate, "yyyy")});
-      testSimpleEval(context, "select current_date;",
-          new String[]{dateFormat(expectedDate, "yyyy-MM-dd")});
-      testSimpleEval(context, "select cast(extract(hour from current_time) as INT4);",
-          new String[]{String.valueOf(Integer.parseInt(dateFormat(expectedDate, "HH")))});
-    } finally {
-      TimeZone.setDefault(originTimeZone);
-    }
+    ZonedDateTime zonedDateTime = ZonedDateTime.now(TimeZone.getTimeZone(context.get(SessionVars.TIMEZONE)).toZoneId());
+
+    testSimpleEval(context, "select to_char(current_timestamp, 'yyyy-MM-dd');",
+        new String[]{dateFormat(zonedDateTime, "yyyy-MM-dd")});
+    testSimpleEval(context, "select cast(extract(year from current_timestamp) as INT4);",
+        new String[]{dateFormat(zonedDateTime, "yyyy")});
+    testSimpleEval(context, "select current_date;",
+        new String[]{dateFormat(zonedDateTime, "yyyy-MM-dd")});
+    testSimpleEval(context, "select cast(extract(hour from current_time) as INT4);",
+        new String[]{String.valueOf(Integer.parseInt(dateFormat(zonedDateTime, "HH")))});
   }
 
-  private String dateFormat(Date date, String format) {
-    SimpleDateFormat df = new SimpleDateFormat(format);
-    return df.format(date);
+  private String dateFormat(ZonedDateTime dateTime, String format) {
+    return dateTime.format(DateTimeFormatter.ofPattern(format));
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestJsonFunctions.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestJsonFunctions.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestJsonFunctions.java
index fc5e8e1..a7d8674 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestJsonFunctions.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestJsonFunctions.java
@@ -51,7 +51,7 @@ public class TestJsonFunctions extends ExprTestBase {
   public void testJsonArrayContains() throws TajoException {
     testSimpleEval("select json_array_contains('" + JSON_COMPLEX_ARRAY + "', 100)", new String[]{"t"});
     testSimpleEval("select json_array_contains('" + JSON_COMPLEX_ARRAY + "', 'test')", new String[]{"t"});
-    testSimpleEval("select json_array_contains('" + JSON_COMPLEX_ARRAY + "', '2015-08-13 11:58:59'::timestamp)",
+    testSimpleEval("select json_array_contains('" + JSON_COMPLEX_ARRAY + "', '2015-08-13 11:58:59'::timestamp::text)",
         new String[]{"t"});
     testSimpleEval("select json_array_contains('" + JSON_COMPLEX_ARRAY + "', '2015-08-13 11:58:59'::date)",
         new String[]{"f"});

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestPatternMatchingPredicates.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestPatternMatchingPredicates.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestPatternMatchingPredicates.java
index 54907fc..f55919e 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestPatternMatchingPredicates.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestPatternMatchingPredicates.java
@@ -36,7 +36,7 @@ public class TestPatternMatchingPredicates extends ExprTestBase {
         .build();
 
     // test for null values
-    testEval(schema, "table1", ",", "select col1 like 'a%' from table1", new String[]{NullDatum.get().toString()});
+    testEval(schema, "table1", "\\NULL,", "select col1 like 'a%' from table1", new String[]{NullDatum.get().toString()});
     testSimpleEval("select null like 'a%'", new String[]{NullDatum.get().toString()});
 
     testEval(schema, "table1", "abc", "select col1 like '%c' from table1", new String[]{"t"});

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java
index 203af8f..a38eb71 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestStringOperatorsAndFunctions.java
@@ -147,9 +147,9 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
         new String[]{"ab--ab"});
 
     // null test from a table
-    testEval(schema, "table1", ",(^--|--$),ab", "select regexp_replace(col1, col2, col3) as str from table1",
+    testEval(schema, "table1", "\\NULL,(^--|--$),ab", "select regexp_replace(col1, col2, col3) as str from table1",
         new String[]{NullDatum.get().toString()});
-    testEval(schema, "table1", "------,(^--|--$),", "select regexp_replace(col1, col2, col3) as str from table1",
+    testEval(schema, "table1", "------,(^--|--$),\\NULL", "select regexp_replace(col1, col2, col3) as str from table1",
         new String[]{NullDatum.get().toString()});
   }
 
@@ -177,7 +177,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
         .build();
 
     // for null tests
-    testEval(schema, "table1", ",1,ghi", "select left(col1,1) is null from table1", new String[]{"t"});
+    testEval(schema, "table1", "\\NULL,1,ghi", "select left(col1,1) is null from table1", new String[]{"t"});
     testEval(schema, "table1", "abc,,ghi", "select left(col1,col2) is null from table1", new String[]{"t"});
 
     testEval(schema, "table1", "abc,1,ghi", "select left(col1,1) || left(col3,3) from table1", new String[]{"aghi"});
@@ -207,8 +207,8 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
         .build();
 
     // for null tests
-    testEval(schema, "table1", ",1,ghi", "select right(col1,1) is null from table1", new String[]{"t"});
-    testEval(schema, "table1", "abc,,ghi", "select right(col1,col2) is null from table1", new String[]{"t"});
+    testEval(schema, "table1", "\\NULL,1,ghi", "select right(col1,1) is null from table1", new String[]{"t"});
+    testEval(schema, "table1", "abc,\\NULL,ghi", "select right(col1,col2) is null from table1", new String[]{"t"});
 
     testEval(schema, "table1", "abc,1,ghi", "select right(col1,1) || right(col3,3) from table1", new String[]{"cghi"});
   }
@@ -387,7 +387,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testEval(schema, "t1", ",.,1", "select split_part(col1, col2, col3::int) is null from t1", new String[]{"t"});
     testEval(schema, "t1", "1386577650.123,,1", "select split_part(col1, col2, col3::int) from t1",
         new String[]{"1386577650.123"});
-    testEval(schema, "t1", "1386577650.123,.,", "select split_part(col1, col2, col3::int) is null from t1",
+    testEval(schema, "t1", "1386577650.123,.,\\NULL", "select split_part(col1, col2, col3::int) is null from t1",
         new String[]{"t"});
   }
 
@@ -463,9 +463,9 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testEval(schema, "table1", ",abcdef,3.14", "select locate(col2, 'cd', 4) from table1", new String[]{"0"});
     testEval(schema, "table1", ",abcdef,3.14", "select locate(col2, 'xy') from table1", new String[]{"0"});
     // null string
-    testEval(schema, "table1", ",abcdef,3.14", "select locate(col1, 'cd') is null from table1", new String[]{"t"});
+    testEval(schema, "table1", "\\NULL,abcdef,3.14", "select locate(col1, 'cd') is null from table1", new String[]{"t"});
     // nul substring
-    testEval(schema, "table1", ",abcdef,3.14", "select locate('cd', col1) is null from table1", new String[]{"t"});
+    testEval(schema, "table1", "\\NULL,abcdef,3.14", "select locate('cd', col1) is null from table1", new String[]{"t"});
   }
 
   @Test
@@ -617,9 +617,9 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
         .add("col1", TEXT)
         .add("col2", TEXT)
         .build();
-    testEval(schema, "table1", "|crt,c,cr,c,def", "select find_in_set(col1, col2) is null from table1",
+    testEval(schema, "table1", "\\NULL|crt,c,cr,c,def", "select find_in_set(col1, col2) is null from table1",
         new String[]{"t"}, '|', true);
-    testEval(schema, "table1", "cr|", "select find_in_set(col1, col2) is null from table1",
+    testEval(schema, "table1", "cr|\\NULL", "select find_in_set(col1, col2) is null from table1",
         new String[]{"t"}, '|', true);
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestEvalNodeToExprConverter.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestEvalNodeToExprConverter.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestEvalNodeToExprConverter.java
index 1cf4cf2..454ae6c 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestEvalNodeToExprConverter.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestEvalNodeToExprConverter.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.engine.planner;
 
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.QueryVars;
 import org.apache.tajo.TajoTestingCluster;
@@ -32,7 +33,6 @@ import org.apache.tajo.plan.LogicalOptimizer;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.LogicalPlanner;
 import org.apache.tajo.plan.expr.AlgebraicUtil;
-import org.apache.tajo.plan.expr.EvalNode;
 import org.apache.tajo.plan.logical.LogicalNode;
 import org.apache.tajo.plan.logical.NodeType;
 import org.apache.tajo.plan.logical.ScanNode;
@@ -79,7 +79,7 @@ public class TestEvalNodeToExprConverter {
     tpch.loadSchemas();
     tpch.loadOutSchema();
     for (String table : tpchTables) {
-      TableMeta m = CatalogUtil.newTableMeta("TEXT");
+      TableMeta m = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
       TableDesc d = CatalogUtil.newTableDesc(
         CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, table), tpch.getSchema(table), m,
         CommonTestingUtil.getTestDir());

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestJoinOrderAlgorithm.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestJoinOrderAlgorithm.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestJoinOrderAlgorithm.java
index bd9c5f9..0805151 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestJoinOrderAlgorithm.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestJoinOrderAlgorithm.java
@@ -20,6 +20,7 @@ package org.apache.tajo.engine.planner;
 
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.TajoTestingCluster;
@@ -88,7 +89,7 @@ public class TestJoinOrderAlgorithm {
         .add("phone", Type.INT4)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     TableDesc people = new TableDesc(
         CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, "employee"), schema, meta,
         CommonTestingUtil.getTestDir().toUri());
@@ -113,7 +114,7 @@ public class TestJoinOrderAlgorithm {
         .add("manager", Type.TEXT)
         .build();
     // Set store type as FAKEFILE to prevent auto update of physical information in LogicalPlanner.updatePhysicalInfo()
-    TableMeta largeTableMeta = CatalogUtil.newTableMeta("FAKEFILE");
+    TableMeta largeTableMeta = CatalogUtil.newTableMeta("FAKEFILE", util.getConfiguration());
     TableDesc largeDept;
     TableStats largeTableStats;
     FileSystem fs = FileSystem.getLocal(util.getConfiguration());

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalOptimizer.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalOptimizer.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalOptimizer.java
index e57921d..1ff7c87 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalOptimizer.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalOptimizer.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.engine.planner;
 
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.TajoTestingCluster;
@@ -82,7 +83,7 @@ public class TestLogicalOptimizer {
         .add("phone", Type.INT4)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     TableDesc people = new TableDesc(
         CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, "employee"), schema, meta,
         CommonTestingUtil.getTestDir().toUri());

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
index d01b0d5..c50a21d 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
@@ -21,10 +21,7 @@ package org.apache.tajo.engine.planner;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-import org.apache.tajo.LocalTajoTestingUtility;
-import org.apache.tajo.QueryVars;
-import org.apache.tajo.TajoConstants;
-import org.apache.tajo.TajoTestingCluster;
+import org.apache.tajo.*;
 import org.apache.tajo.algebra.AlterTableOpType;
 import org.apache.tajo.algebra.Expr;
 import org.apache.tajo.algebra.JoinType;
@@ -102,7 +99,7 @@ public class TestLogicalPlanner {
         .add("score", Type.INT4)
         .build();
 
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     TableDesc people = new TableDesc(
         CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, "employee"), schema, meta,
         CommonTestingUtil.getTestDir().toUri());
@@ -131,7 +128,7 @@ public class TestLogicalPlanner {
     tpch.loadSchemas();
     tpch.loadOutSchema();
     for (String table : tpchTables) {
-      TableMeta m = CatalogUtil.newTableMeta("TEXT");
+      TableMeta m = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
       TableDesc d = CatalogUtil.newTableDesc(
           CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, table), tpch.getSchema(table), m,
           CommonTestingUtil.getTestDir());
@@ -1335,7 +1332,8 @@ public class TestLogicalPlanner {
 
   @Test
   public void testSelectFromSelfDescTable() throws Exception {
-    TableDesc tableDesc = new TableDesc("default.self_desc_table1", null, CatalogUtil.newTableMeta("TEXT"),
+    TableDesc tableDesc = new TableDesc("default.self_desc_table1", null,
+        CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration()),
         CommonTestingUtil.getTestDir().toUri(), true);
     catalog.createTable(tableDesc);
     assertTrue(catalog.existsTable("default.self_desc_table1"));
@@ -1388,7 +1386,8 @@ public class TestLogicalPlanner {
 
   @Test
   public void testSelectWhereFromSelfDescTable() throws Exception {
-    TableDesc tableDesc = new TableDesc("default.self_desc_table1", null, CatalogUtil.newTableMeta("TEXT"),
+    TableDesc tableDesc = new TableDesc("default.self_desc_table1", null,
+        CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration()),
         CommonTestingUtil.getTestDir().toUri(), true);
     catalog.createTable(tableDesc);
     assertTrue(catalog.existsTable("default.self_desc_table1"));

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestPlannerUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestPlannerUtil.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestPlannerUtil.java
index 92557f1..7fd249d 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestPlannerUtil.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestPlannerUtil.java
@@ -22,6 +22,7 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.LocatedFileStatus;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.fs.RemoteIterator;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.TajoTestingCluster;
@@ -85,7 +86,7 @@ public class TestPlannerUtil {
         .add("deptname", Type.TEXT)
         .add("score", CatalogUtil.newSimpleDataType(Type.INT4)).build();
 
-    TableMeta meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     TableDesc people = new TableDesc(
         CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, "employee"), schema, meta,
         CommonTestingUtil.getTestDir().toUri());

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestExternalSortExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestExternalSortExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestExternalSortExec.java
index 5481d07..cb49552 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestExternalSortExec.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestExternalSortExec.java
@@ -19,10 +19,7 @@
 package org.apache.tajo.engine.planner.physical;
 
 import org.apache.hadoop.fs.Path;
-import org.apache.tajo.LocalTajoTestingUtility;
-import org.apache.tajo.SessionVars;
-import org.apache.tajo.TajoConstants;
-import org.apache.tajo.TajoTestingCluster;
+import org.apache.tajo.*;
 import org.apache.tajo.algebra.Expr;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -121,7 +118,7 @@ public class TestExternalSortExec {
         new Column("col12", Type.INT8)
     }).build();
 
-    TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta employeeMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path employeePath = new Path(testDir, "employee.csv");
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(employeeMeta, tableSchema, employeePath);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterHashJoinExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterHashJoinExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterHashJoinExec.java
index 1d2e6b5..5c56aef 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterHashJoinExec.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterHashJoinExec.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.planner.physical;
 
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.algebra.Expr;
@@ -108,7 +109,7 @@ public class TestFullOuterHashJoinExec {
         .build();
 
 
-    TableMeta dep3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta dep3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path dep3Path = new Path(testDir, "dep3.csv");
     Appender appender1 = ((FileTablespace) TablespaceManager.getLocalFs()).getAppender(dep3Meta, dep3Schema, dep3Path);
     appender1.init();
@@ -138,7 +139,7 @@ public class TestFullOuterHashJoinExec {
         .build();
 
 
-    TableMeta job3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta job3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path job3Path = new Path(testDir, "job3.csv");
     Appender appender2 = ((FileTablespace) TablespaceManager.getLocalFs()).getAppender(job3Meta, job3Schema, job3Path);
     appender2.init();
@@ -178,7 +179,7 @@ public class TestFullOuterHashJoinExec {
         .build();
 
 
-    TableMeta emp3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta emp3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path emp3Path = new Path(testDir, "emp3.csv");
     Appender appender3 = ((FileTablespace) TablespaceManager.getLocalFs()).getAppender(emp3Meta, emp3Schema, emp3Path);
     appender3.init();
@@ -231,7 +232,7 @@ public class TestFullOuterHashJoinExec {
         .build();
 
 
-    TableMeta phone3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta phone3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path phone3Path = new Path(testDir, "phone3.csv");
     Appender appender5 = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(phone3Meta, phone3Schema, phone3Path);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterMergeJoinExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterMergeJoinExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterMergeJoinExec.java
index 0fb7bbb..605ad6e 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterMergeJoinExec.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestFullOuterMergeJoinExec.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.planner.physical;
 
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.TajoTestingCluster;
@@ -112,7 +113,7 @@ public class TestFullOuterMergeJoinExec {
         .build();
 
 
-    TableMeta dep3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta dep3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path dep3Path = new Path(testDir, "dep3.csv");
     Appender appender1 = ((FileTablespace) TablespaceManager.getLocalFs()).getAppender(dep3Meta, dep3Schema, dep3Path);
     appender1.init();
@@ -151,7 +152,7 @@ public class TestFullOuterMergeJoinExec {
         .build();
 
 
-    TableMeta dep4Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta dep4Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path dep4Path = new Path(testDir, "dep4.csv");
     Appender appender4 = ((FileTablespace) TablespaceManager.getLocalFs()).getAppender(dep4Meta, dep4Schema, dep4Path);
     appender4.init();
@@ -183,7 +184,7 @@ public class TestFullOuterMergeJoinExec {
         .build();
 
 
-    TableMeta job3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta job3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path job3Path = new Path(testDir, "job3.csv");
     Appender appender2 = ((FileTablespace) TablespaceManager.getLocalFs()).getAppender(job3Meta, job3Schema, job3Path);
     appender2.init();
@@ -223,7 +224,7 @@ public class TestFullOuterMergeJoinExec {
         .build();
 
 
-    TableMeta emp3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta emp3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path emp3Path = new Path(testDir, "emp3.csv");
     Appender appender3 = ((FileTablespace) TablespaceManager.getLocalFs()).getAppender(emp3Meta, emp3Schema, emp3Path);
     appender3.init();
@@ -276,7 +277,7 @@ public class TestFullOuterMergeJoinExec {
         .build();
 
 
-    TableMeta phone3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta phone3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path phone3Path = new Path(testDir, "phone3.csv");
     Appender appender5 = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(phone3Meta, phone3Schema, phone3Path);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashAntiJoinExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashAntiJoinExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashAntiJoinExec.java
index cd04ea0..1398c4d 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashAntiJoinExec.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashAntiJoinExec.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.planner.physical;
 
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.algebra.Expr;
@@ -85,7 +86,7 @@ public class TestHashAntiJoinExec {
         .add("deptname", Type.TEXT)
         .build();
 
-    TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta employeeMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path employeePath = new Path(testDir, "employee.csv");
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(employeeMeta, employeeSchema, employeePath);
@@ -112,7 +113,7 @@ public class TestHashAntiJoinExec {
         .add("name", Type.TEXT)
         .add("age", Type.INT4)
         .build();
-    TableMeta peopleMeta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta peopleMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path peoplePath = new Path(testDir, "people.csv");
     appender = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(peopleMeta, peopleSchema, peoplePath);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashJoinExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashJoinExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashJoinExec.java
index cdf9068..191c346 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashJoinExec.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashJoinExec.java
@@ -19,10 +19,7 @@
 package org.apache.tajo.engine.planner.physical;
 
 import org.apache.hadoop.fs.Path;
-import org.apache.tajo.LocalTajoTestingUtility;
-import org.apache.tajo.SessionVars;
-import org.apache.tajo.TajoConstants;
-import org.apache.tajo.TajoTestingCluster;
+import org.apache.tajo.*;
 import org.apache.tajo.algebra.Expr;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -87,7 +84,7 @@ public class TestHashJoinExec {
         .add("deptname", Type.TEXT)
         .build();
 
-    TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta employeeMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path employeePath = new Path(testDir, "employee.csv");
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(employeeMeta, employeeSchema, employeePath);
@@ -111,7 +108,8 @@ public class TestHashJoinExec {
         .add("name", Type.TEXT)
         .add("age", Type.INT4)
         .build();
-    TableMeta peopleMeta = CatalogUtil.newTableMeta("TEXT");
+
+    TableMeta peopleMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path peoplePath = new Path(testDir, "people.csv");
     appender = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(peopleMeta, peopleSchema, peoplePath);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashSemiJoinExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashSemiJoinExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashSemiJoinExec.java
index 026bbe2..baebf80 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashSemiJoinExec.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestHashSemiJoinExec.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.planner.physical;
 
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.algebra.Expr;
@@ -85,7 +86,7 @@ public class TestHashSemiJoinExec {
         .add("deptname", Type.TEXT)
         .build();
 
-    TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta employeeMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path employeePath = new Path(testDir, "employee.csv");
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(employeeMeta, employeeSchema, employeePath);
@@ -112,7 +113,8 @@ public class TestHashSemiJoinExec {
         .add("name", Type.TEXT)
         .add("age", Type.INT4)
         .build();
-    TableMeta peopleMeta = CatalogUtil.newTableMeta("TEXT");
+
+    TableMeta peopleMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path peoplePath = new Path(testDir, "people.csv");
     appender = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(peopleMeta, peopleSchema, peoplePath);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestLeftOuterHashJoinExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestLeftOuterHashJoinExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestLeftOuterHashJoinExec.java
index c308065..fa20941 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestLeftOuterHashJoinExec.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestLeftOuterHashJoinExec.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.planner.physical;
 
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.algebra.Expr;
@@ -106,7 +107,7 @@ public class TestLeftOuterHashJoinExec {
         .build();
 
 
-    TableMeta dep3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta dep3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path dep3Path = new Path(testDir, "dep3.csv");
     Appender appender1 = ((FileTablespace) TablespaceManager.getLocalFs()).getAppender(dep3Meta, dep3Schema, dep3Path);
     appender1.init();
@@ -136,7 +137,7 @@ public class TestLeftOuterHashJoinExec {
         .build();
 
 
-    TableMeta job3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta job3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path job3Path = new Path(testDir, "job3.csv");
     Appender appender2 = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(job3Meta, job3Schema, job3Path);
@@ -177,7 +178,7 @@ public class TestLeftOuterHashJoinExec {
         .build();
 
 
-    TableMeta emp3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta emp3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path emp3Path = new Path(testDir, "emp3.csv");
     Appender appender3 = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(emp3Meta, emp3Schema, emp3Path);
@@ -231,7 +232,7 @@ public class TestLeftOuterHashJoinExec {
         .build();
 
 
-    TableMeta phone3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta phone3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path phone3Path = new Path(testDir, "phone3.csv");
     Appender appender5 = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(phone3Meta, phone3Schema, phone3Path);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestMergeJoinExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestMergeJoinExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestMergeJoinExec.java
index 5819003..d3d1c24 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestMergeJoinExec.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestMergeJoinExec.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.planner.physical;
 
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.TajoTestingCluster;
@@ -85,7 +86,7 @@ public class TestMergeJoinExec {
         .add("deptname", Type.TEXT)
         .build();
 
-    TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta employeeMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path employeePath = new Path(testDir, "employee.csv");
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(employeeMeta, employeeSchema, employeePath);
@@ -115,7 +116,8 @@ public class TestMergeJoinExec {
         .add("name", Type.TEXT)
         .add("age", Type.INT4)
         .build();
-    TableMeta peopleMeta = CatalogUtil.newTableMeta("TEXT");
+
+    TableMeta peopleMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path peoplePath = new Path(testDir, "people.csv");
     appender = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(peopleMeta, peopleSchema, peoplePath);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
index 694193d..c3a669e 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
@@ -117,7 +117,7 @@ public class TestPhysicalPlanner {
         .add("nullable", Type.TEXT)
         .build();
 
-    TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta employeeMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
 
 
     Path employeePath = new Path(testDir, "employee.csv");
@@ -138,7 +138,7 @@ public class TestPhysicalPlanner {
     catalog.createTable(employee);
 
     Path scorePath = new Path(testDir, "score");
-    TableMeta scoreMeta = CatalogUtil.newTableMeta("TEXT", new KeyValueSet());
+    TableMeta scoreMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);
     appender = sm.getAppender(scoreMeta, scoreSchema, scorePath);
     appender.init();
     score = new TableDesc(
@@ -435,7 +435,7 @@ public class TestPhysicalPlanner {
     LogicalPlan plan = planner.createPlan(defaultContext, context);
     LogicalNode rootNode = optimizer.optimize(plan);
 
-    TableMeta outputMeta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta outputMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);;
 
     PhysicalPlanner phyPlanner = new PhysicalPlannerImpl(conf);
     PhysicalExec exec = phyPlanner.createPlan(ctx, rootNode);
@@ -504,7 +504,7 @@ public class TestPhysicalPlanner {
     long totalNum = 0;
     for (FileStatus status : fs.listStatus(ctx.getOutputPath().getParent())) {
       Scanner scanner =  ((FileTablespace) TablespaceManager.getLocalFs()).getFileScanner(
-          CatalogUtil.newTableMeta("TEXT"),
+          CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf),
           rootNode.getOutSchema(),
           status.getPath());
 
@@ -532,7 +532,7 @@ public class TestPhysicalPlanner {
     LogicalPlan plan = planner.createPlan(defaultContext, context);
     LogicalNode rootNode = optimizer.optimize(plan);
 
-    TableMeta outputMeta = CatalogUtil.newTableMeta("RCFILE");
+    TableMeta outputMeta = CatalogUtil.newTableMeta(BuiltinStorages.RCFILE, conf);
 
     PhysicalPlanner phyPlanner = new PhysicalPlannerImpl(conf);
     PhysicalExec exec = phyPlanner.createPlan(ctx, rootNode);
@@ -648,7 +648,7 @@ public class TestPhysicalPlanner {
     ctx.setDataChannel(dataChannel);
     LogicalNode rootNode = optimizer.optimize(plan);
 
-    TableMeta outputMeta = CatalogUtil.newTableMeta(dataChannel.getDataFormat());
+    TableMeta outputMeta = CatalogUtil.newTableMeta(dataChannel.getDataFormat(), conf);
 
     FileSystem fs = sm.getFileSystem();
     QueryId queryId = id.getTaskId().getExecutionBlockId().getQueryId();
@@ -745,7 +745,7 @@ public class TestPhysicalPlanner {
       long expectedFileNum = (long) Math.ceil(fileVolumSum / (float)StorageUnit.MB);
       assertEquals(expectedFileNum, fileStatuses.length);
     }
-    TableMeta outputMeta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta outputMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, conf);;
     Scanner scanner = new MergeScanner(conf, rootNode.getOutSchema(), outputMeta, new ArrayList<>(fragments));
     scanner.init();
 
@@ -782,7 +782,7 @@ public class TestPhysicalPlanner {
     ctx.setDataChannel(dataChannel);
     optimizer.optimize(plan);
 
-    TableMeta outputMeta = CatalogUtil.newTableMeta(dataChannel.getDataFormat());
+    TableMeta outputMeta = CatalogUtil.newTableMeta(dataChannel.getDataFormat(), conf);
 
     FileSystem fs = sm.getFileSystem();
     QueryId queryId = id.getTaskId().getExecutionBlockId().getQueryId();

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestProgressExternalSortExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestProgressExternalSortExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestProgressExternalSortExec.java
index 51cd5ea..f88e2ef 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestProgressExternalSortExec.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestProgressExternalSortExec.java
@@ -86,7 +86,7 @@ public class TestProgressExternalSortExec {
         .add("deptname", TajoDataTypes.Type.TEXT)
         .build();
 
-    TableMeta employeeMeta = CatalogUtil.newTableMeta(BuiltinStorages.RAW);
+    TableMeta employeeMeta = CatalogUtil.newTableMeta(BuiltinStorages.RAW, conf);
     Path employeePath = new Path(testDir, "employee.raw");
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(employeeMeta, schema, employeePath);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRadixSort.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRadixSort.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRadixSort.java
index f357379..ed5c3f8 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRadixSort.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRadixSort.java
@@ -36,6 +36,8 @@ import org.apache.tajo.storage.VTuple;
 import org.apache.tajo.tuple.memory.UnSafeTuple;
 import org.apache.tajo.tuple.memory.UnSafeTupleList;
 import org.apache.tajo.util.StringUtils;
+import org.apache.tajo.util.datetime.DateTimeConstants;
+import org.apache.tajo.util.datetime.DateTimeUtil;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -219,7 +221,10 @@ public class TestRadixSort {
         DatumFactory.createInt4(Integer.MAX_VALUE),
         DatumFactory.createInt2(Short.MAX_VALUE),
         DatumFactory.createDate(Integer.MAX_VALUE),
-        DatumFactory.createTimestamp(Long.MAX_VALUE),
+        DatumFactory.createTimestamp(
+            // FIXME 'Out of Range of Time'
+            //DateTimeUtil.toJulianDate(JULIAN_MAXYEAR, 1, 1)
+            DateTimeUtil.toJulianTimestamp(DateTimeConstants.JULIAN_MAXYEAR / 20, 1, 1, 0, 0, 0, 0)),
         DatumFactory.createTime(Long.MAX_VALUE),
         DatumFactory.createInet4(Integer.MAX_VALUE),
         DatumFactory.createFloat4(Float.MAX_VALUE),

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterHashJoinExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterHashJoinExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterHashJoinExec.java
index 83d26c7..015cf73 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterHashJoinExec.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterHashJoinExec.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.planner.physical;
 
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.algebra.Expr;
@@ -100,7 +101,7 @@ public class TestRightOuterHashJoinExec {
         .build();
 
 
-    TableMeta dep3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta dep3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path dep3Path = new Path(testDir, "dep3.csv");
     Appender appender1 = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(dep3Meta, dep3Schema, dep3Path);
@@ -131,7 +132,7 @@ public class TestRightOuterHashJoinExec {
         .build();
 
 
-    TableMeta job3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta job3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path job3Path = new Path(testDir, "job3.csv");
     Appender appender2 = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(job3Meta, job3Schema, job3Path);
@@ -172,7 +173,7 @@ public class TestRightOuterHashJoinExec {
         .build();
 
 
-    TableMeta emp3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta emp3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path emp3Path = new Path(testDir, "emp3.csv");
     Appender appender3 = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(emp3Meta, emp3Schema, emp3Path);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterMergeJoinExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterMergeJoinExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterMergeJoinExec.java
index 4bfe0f7..a6b5d4f 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterMergeJoinExec.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRightOuterMergeJoinExec.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.planner.physical;
 
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.algebra.Expr;
@@ -111,7 +112,7 @@ public class TestRightOuterMergeJoinExec {
         .build();
 
 
-    TableMeta dep3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta dep3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path dep3Path = new Path(testDir, "dep3.csv");
     Appender appender1 = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(dep3Meta, dep3Schema, dep3Path);
@@ -151,7 +152,7 @@ public class TestRightOuterMergeJoinExec {
         .build();
 
 
-    TableMeta dep4Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta dep4Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path dep4Path = new Path(testDir, "dep4.csv");
     Appender appender4 = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(dep4Meta, dep4Schema, dep4Path);
@@ -184,7 +185,7 @@ public class TestRightOuterMergeJoinExec {
         .build();
 
 
-    TableMeta job3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta job3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path job3Path = new Path(testDir, "job3.csv");
     Appender appender2 = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(job3Meta, job3Schema, job3Path);
@@ -225,7 +226,7 @@ public class TestRightOuterMergeJoinExec {
         .build();
 
 
-    TableMeta emp3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta emp3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path emp3Path = new Path(testDir, "emp3.csv");
     Appender appender3 = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(emp3Meta, emp3Schema, emp3Path);
@@ -278,7 +279,7 @@ public class TestRightOuterMergeJoinExec {
         .add("phone_number", Type.TEXT)
         .build();
 
-    TableMeta phone3Meta = CatalogUtil.newTableMeta("TEXT");
+    TableMeta phone3Meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path phone3Path = new Path(testDir, "phone3.csv");
     Appender appender5 = ((FileTablespace) TablespaceManager.getLocalFs())
         .getAppender(phone3Meta, phone3Schema, phone3Path);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestSortExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestSortExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestSortExec.java
index 07b392a..235d126 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestSortExec.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestSortExec.java
@@ -19,10 +19,7 @@
 package org.apache.tajo.engine.planner.physical;
 
 import org.apache.hadoop.fs.Path;
-import org.apache.tajo.LocalTajoTestingUtility;
-import org.apache.tajo.TajoConstants;
-import org.apache.tajo.TajoTestingCluster;
-import org.apache.tajo.TpchTestBase;
+import org.apache.tajo.*;
 import org.apache.tajo.algebra.Expr;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -87,7 +84,7 @@ public class TestSortExec {
         .add("deptname", Type.TEXT)
         .build();
 
-    employeeMeta = CatalogUtil.newTableMeta("TEXT");
+    employeeMeta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
 
     tablePath = StorageUtil.concatPath(workDir, "employee", "table1");
     sm.getFileSystem().mkdirs(tablePath.getParent());

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestSortIntersectExec.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestSortIntersectExec.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestSortIntersectExec.java
index 7a9385b..5200cde 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestSortIntersectExec.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestSortIntersectExec.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.planner.physical;
 
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.LocalTajoTestingUtility;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.algebra.Expr;
@@ -91,7 +92,7 @@ public class TestSortIntersectExec {
         .add("deptname", TajoDataTypes.Type.TEXT)
         .build();
 
-    TableMeta employeeMeta1 = CatalogUtil.newTableMeta("TEXT");
+    TableMeta employeeMeta1 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path employeePath1 = new Path(testDir, "employee1.csv");
     Appender appender = ((FileTablespace) TablespaceManager.getLocalFs()).
         getAppender(employeeMeta1, employeeSchema1, employeePath1);
@@ -119,7 +120,7 @@ public class TestSortIntersectExec {
         .add("deptname", TajoDataTypes.Type.TEXT)
         .build();
 
-    TableMeta employeeMeta2 = CatalogUtil.newTableMeta("TEXT");
+    TableMeta employeeMeta2 = CatalogUtil.newTableMeta(BuiltinStorages.TEXT, util.getConfiguration());
     Path employeePath2 = new Path(testDir, "employee2.csv");
     Appender appender2 = ((FileTablespace) TablespaceManager.getLocalFs()).
         getAppender(employeeMeta2, employeeSchema2, employeePath2);

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJsonWithTimezone.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJsonWithTimezone.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJsonWithTimezone.java
index 3380b1f..9eeba73 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJsonWithTimezone.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJsonWithTimezone.java
@@ -18,7 +18,6 @@
 
 package org.apache.tajo.engine.query;
 
-import com.google.common.collect.Lists;
 import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.SessionVars;
 import org.junit.Test;
@@ -74,8 +73,6 @@ public class TestJsonWithTimezone extends QueryTestCaseBase {
     } finally {
       executeString("DROP TABLE IF EXISTS timezoned3");
     }
-
-    getClient().unsetSessionVariables(Lists.newArrayList("TIMEZONE"));
   }
 
   @Test
@@ -96,8 +93,9 @@ public class TestJsonWithTimezone extends QueryTestCaseBase {
   @Test
   public void testTimezonedTable5() throws Exception {
     // Table - timezone = GMT+9 (by a specified system timezone)
-    // TajoClient uses JVM default timezone (GMT+9)
+    // Client - GMT+9 (SET TIME ZONE 'GMT+9')
 
+    TimeZone systemTimeZone = testingCluster.getConfiguration().getSystemTimezone();
     try {
       testingCluster.getConfiguration().setSystemTimezone(TimeZone.getTimeZone("GMT+9"));
 
@@ -109,7 +107,7 @@ public class TestJsonWithTimezone extends QueryTestCaseBase {
       executeString("DROP TABLE IF EXISTS timezoned5");
 
       // restore the config
-      testingCluster.getConfiguration().setSystemTimezone(TimeZone.getTimeZone("GMT"));
+      testingCluster.getConfiguration().setSystemTimezone(systemTimeZone);
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/aad78a4e/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java
index 61b5551..7a88198 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSelectQuery.java
@@ -627,8 +627,6 @@ public class TestSelectQuery extends QueryTestCaseBase {
     } finally {
       executeString("DROP TABLE IF EXISTS timezoned3");
     }
-
-    getClient().unsetSessionVariables(Lists.newArrayList("TIMEZONE"));
   }
 
   @Test
@@ -649,8 +647,9 @@ public class TestSelectQuery extends QueryTestCaseBase {
   @Test
   public void testTimezonedTable5() throws Exception {
     // Table - timezone = GMT+9 (by a specified system timezone)
-    // TajoClient uses JVM default timezone (GMT+9)
+    // Client - GMT+9 (SET TIME ZONE 'GMT+9';)
 
+    TimeZone systemTimeZone = testingCluster.getConfiguration().getSystemTimezone();
     try {
       testingCluster.getConfiguration().setSystemTimezone(TimeZone.getTimeZone("GMT+9"));
 
@@ -662,7 +661,7 @@ public class TestSelectQuery extends QueryTestCaseBase {
       executeString("DROP TABLE IF EXISTS timezoned5");
 
       // restore the config
-      testingCluster.getConfiguration().setSystemTimezone(TimeZone.getTimeZone("GMT"));
+      testingCluster.getConfiguration().setSystemTimezone(systemTimeZone);
     }
   }
 
@@ -677,7 +676,6 @@ public class TestSelectQuery extends QueryTestCaseBase {
 
       ResultSet res = executeQuery();
       assertResultSet(res, "testTimezonedTable3.result");
-      executeString("SET TIME ZONE 'GMT'");
       cleanupQuery(res);
     } finally {
       executeString("DROP TABLE IF EXISTS timezoned_load1");