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

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

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();