You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2016/03/28 06:07:24 UTC

[1/5] tajo git commit: TAJO-2099: Implement an Adapter for legacy Schema.

Repository: tajo
Updated Branches:
  refs/heads/master 682635852 -> 8dad551ec


http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 a9d8ce2..18d5012 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
@@ -60,7 +60,7 @@ public class TestBSTIndex {
     this.dataFormat = type;
     conf = new TajoConf();
     conf.setVar(TajoConf.ConfVars.ROOT_DIR, TEST_PATH);
-    schema = new Schema();
+    schema = SchemaFactory.newV1();
     schema.addColumn(new Column("int", Type.INT4));
     schema.addColumn(new Column("long", Type.INT8));
     schema.addColumn(new Column("double", Type.FLOAT8));
@@ -111,7 +111,7 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), true, false);
 
-    Schema keySchema = new Schema();
+    Schema keySchema = SchemaFactory.newV1();
     keySchema.addColumn(new Column("long", Type.INT8));
     keySchema.addColumn(new Column("double", Type.FLOAT8));
 
@@ -187,7 +187,7 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), true, false);
 
-    Schema keySchema = new Schema();
+    Schema keySchema = SchemaFactory.newV1();
     keySchema.addColumn(new Column("long", Type.INT8));
     keySchema.addColumn(new Column("double", Type.FLOAT8));
 
@@ -280,7 +280,7 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), true, false);
 
-    Schema keySchema = new Schema();
+    Schema keySchema = SchemaFactory.newV1();
     keySchema.addColumn(new Column("long", Type.INT8));
     keySchema.addColumn(new Column("double", Type.FLOAT8));
 
@@ -353,7 +353,7 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("int"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("long"), true, false);
 
-    Schema keySchema = new Schema();
+    Schema keySchema = SchemaFactory.newV1();
     keySchema.addColumn(new Column("int", Type.INT4));
     keySchema.addColumn(new Column("long", Type.INT8));
 
@@ -446,7 +446,7 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("int"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("long"), true, false);
 
-    Schema keySchema = new Schema();
+    Schema keySchema = SchemaFactory.newV1();
     keySchema.addColumn(new Column("int", Type.INT4));
     keySchema.addColumn(new Column("long", Type.INT8));
 
@@ -529,7 +529,7 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), true, false);
 
-    Schema keySchema = new Schema();
+    Schema keySchema = SchemaFactory.newV1();
     keySchema.addColumn(new Column("long", Type.INT8));
     keySchema.addColumn(new Column("double", Type.FLOAT8));
 
@@ -614,7 +614,7 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("int"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("long"), true, false);
 
-    Schema keySchema = new Schema();
+    Schema keySchema = SchemaFactory.newV1();
     keySchema.addColumn(new Column("int", Type.INT4));
     keySchema.addColumn(new Column("long", Type.INT8));
 
@@ -721,7 +721,7 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("int"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("long"), true, false);
 
-    Schema keySchema = new Schema();
+    Schema keySchema = SchemaFactory.newV1();
     keySchema.addColumn(new Column("int", Type.INT4));
     keySchema.addColumn(new Column("long", Type.INT8));
 
@@ -803,7 +803,7 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), false, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), false, false);
 
-    Schema keySchema = new Schema();
+    Schema keySchema = SchemaFactory.newV1();
     keySchema.addColumn(new Column("long", Type.INT8));
     keySchema.addColumn(new Column("double", Type.FLOAT8));
 
@@ -896,7 +896,7 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("int"), false, false);
     sortKeys[1] = new SortSpec(schema.getColumn("long"), false, false);
 
-    Schema keySchema = new Schema();
+    Schema keySchema = SchemaFactory.newV1();
     keySchema.addColumn(new Column("int", Type.INT4));
     keySchema.addColumn(new Column("long", Type.INT8));
 
@@ -996,7 +996,7 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), true, false);
 
-    Schema keySchema = new Schema();
+    Schema keySchema = SchemaFactory.newV1();
     keySchema.addColumn(new Column("long", Type.INT8));
     keySchema.addColumn(new Column("double", Type.FLOAT8));
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 b2ca5b8..1053853 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
@@ -56,7 +56,7 @@ public class TestSingleCSVFileBSTIndex {
   public TestSingleCSVFileBSTIndex() {
     conf = new TajoConf();
     conf.setVar(ConfVars.ROOT_DIR, TEST_PATH);
-    schema = new Schema();
+    schema = SchemaFactory.newV1();
     schema.addColumn(new Column("int", Type.INT4));
     schema.addColumn(new Column("long", Type.INT8));
     schema.addColumn(new Column("double", Type.FLOAT8));
@@ -99,7 +99,7 @@ public class TestSingleCSVFileBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), true, false);
 
-    Schema keySchema = new Schema();
+    Schema keySchema = SchemaFactory.newV1();
     keySchema.addColumn(new Column("long", Type.INT8));
     keySchema.addColumn(new Column("double", Type.FLOAT8));
 
@@ -190,7 +190,7 @@ public class TestSingleCSVFileBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("int"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("long"), true, false);
 
-    Schema keySchema = new Schema();
+    Schema keySchema = SchemaFactory.newV1();
     keySchema.addColumn(new Column("int", Type.INT4));
     keySchema.addColumn(new Column("long", Type.INT8));
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 75e59da..c2ce9e7 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
@@ -23,6 +23,7 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.conf.TajoConf;
@@ -39,7 +40,7 @@ import java.net.URL;
 import static org.junit.Assert.*;
 
 public class TestJsonSerDe {
-  private static Schema schema = new Schema();
+  private static Schema schema = SchemaFactory.newV1();
 
   static {
     schema.addColumn("col1", TajoDataTypes.Type.BOOLEAN);
@@ -104,7 +105,7 @@ public class TestJsonSerDe {
     FileStatus status = fs.getFileStatus(tablePath);
     FileFragment fragment = new FileFragment("table", tablePath, 0, status.getLen());
 
-    Schema  schema = new Schema();
+    Schema  schema = SchemaFactory.newV1();
     schema.addColumn("col1", TajoDataTypes.Type.TEXT);
     schema.addColumn("col2", TajoDataTypes.Type.TEXT);
     schema.addColumn("col3", TajoDataTypes.Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestReadWrite.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestReadWrite.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestReadWrite.java
index ea223e7..b39bfce 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestReadWrite.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestReadWrite.java
@@ -24,6 +24,7 @@ import org.apache.hadoop.fs.LocalFileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.DatumFactory;
@@ -67,7 +68,7 @@ public class TestReadWrite {
     columns.add(new Column("mynull", Type.NULL_TYPE));
     Column[] columnsArray = new Column[columns.size()];
     columnsArray = columns.toArray(columnsArray);
-    return new Schema(columnsArray);
+    return SchemaFactory.newV1(columnsArray);
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestSchemaConverter.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestSchemaConverter.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestSchemaConverter.java
index ba3f72e..87b5c34 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestSchemaConverter.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/parquet/TestSchemaConverter.java
@@ -22,6 +22,7 @@ import org.apache.parquet.schema.MessageType;
 import org.apache.parquet.schema.MessageTypeParser;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.junit.Test;
 
@@ -80,7 +81,7 @@ public class TestSchemaConverter {
     columns.add(new Column("myprotobuf", Type.PROTOBUF));
     Column[] columnsArray = new Column[columns.size()];
     columnsArray = columns.toArray(columnsArray);
-    return new Schema(columnsArray);
+    return SchemaFactory.newV1(columnsArray);
   }
 
   private Schema createAllTypesConvertedSchema() {
@@ -95,7 +96,7 @@ public class TestSchemaConverter {
     columns.add(new Column("myfixed", Type.BLOB));
     Column[] columnsArray = new Column[columns.size()];
     columnsArray = columns.toArray(columnsArray);
-    return new Schema(columnsArray);
+    return SchemaFactory.newV1(columnsArray);
   }
 
   private void testTajoToParquetConversion(

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 fb69fa4..1a5a41e 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
@@ -26,10 +26,7 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
 import org.apache.tajo.BuiltinStorages;
-import org.apache.tajo.catalog.CatalogUtil;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.SchemaUtil;
-import org.apache.tajo.catalog.TableMeta;
+import org.apache.tajo.catalog.*;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.DatumFactory;
@@ -130,7 +127,7 @@ public class TestDirectRawFile {
   }
 
   static {
-    schema = new Schema();
+    schema = SchemaFactory.newV1();
     schema.addColumn("col0", TajoDataTypes.Type.BOOLEAN);
     schema.addColumn("col1", TajoDataTypes.Type.INT2);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-storage/tajo-storage-jdbc/src/main/java/org/apache/tajo/storage/jdbc/JdbcMetadataProviderBase.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-jdbc/src/main/java/org/apache/tajo/storage/jdbc/JdbcMetadataProviderBase.java b/tajo-storage/tajo-storage-jdbc/src/main/java/org/apache/tajo/storage/jdbc/JdbcMetadataProviderBase.java
index eff1b9c..f53c3ed 100644
--- a/tajo-storage/tajo-storage-jdbc/src/main/java/org/apache/tajo/storage/jdbc/JdbcMetadataProviderBase.java
+++ b/tajo-storage/tajo-storage-jdbc/src/main/java/org/apache/tajo/storage/jdbc/JdbcMetadataProviderBase.java
@@ -208,7 +208,7 @@ public abstract class JdbcMetadataProviderBase implements MetadataProvider {
       });
 
       // transform the pair list into collection for columns
-      final Schema schema = new Schema(Collections2.transform(columns, new Function<Pair<Integer,Column>, Column>() {
+      final Schema schema = SchemaFactory.newV1(Collections2.transform(columns, new Function<Pair<Integer,Column>, Column>() {
         @Override
         public Column apply(@Nullable Pair<Integer, Column> columnPair) {
           return columnPair.getSecond();


[3/5] tajo git commit: TAJO-2099: Implement an Adapter for legacy Schema.

Posted by hy...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 4ae3e5a..ce5a6ab 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
@@ -67,16 +67,16 @@ public class TestJoinOrderAlgorithm {
       catalog.createFunction(funcDesc);
     }
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("name", Type.TEXT);
     schema.addColumn("empid", Type.INT4);
     schema.addColumn("deptname", Type.TEXT);
 
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("deptname", Type.TEXT);
     schema2.addColumn("manager", Type.TEXT);
 
-    Schema schema3 = new Schema();
+    Schema schema3 = SchemaFactory.newV1();
     schema3.addColumn("deptname", Type.TEXT);
     schema3.addColumn("score", Type.INT4);
     schema3.addColumn("phone", Type.INT4);
@@ -101,7 +101,7 @@ public class TestJoinOrderAlgorithm {
 
     ///////////////////////////////////////////////////////////////////////////
     // creating table for overflow in JoinOrderOptimizer.
-    Schema schema4 = new Schema();
+    Schema schema4 = SchemaFactory.newV1();
     schema4.addColumn("deptname", Type.TEXT);
     schema4.addColumn("manager", Type.TEXT);
     // Set store type as FAKEFILE to prevent auto update of physical information in LogicalPlanner.updatePhysicalInfo()

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 1b911a1..56ef78b 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
@@ -65,16 +65,16 @@ public class TestLogicalOptimizer {
       catalog.createFunction(funcDesc);
     }
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("name", Type.TEXT);
     schema.addColumn("empid", Type.INT4);
     schema.addColumn("deptname", Type.TEXT);
 
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("deptname", Type.TEXT);
     schema2.addColumn("manager", Type.TEXT);
 
-    Schema schema3 = new Schema();
+    Schema schema3 = SchemaFactory.newV1();
     schema3.addColumn("deptname", Type.TEXT);
     schema3.addColumn("score", Type.INT4);
     schema3.addColumn("phone", Type.INT4);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 98874ba..d09ef77 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
@@ -86,16 +86,16 @@ public class TestLogicalPlanner {
       catalog.createFunction(funcDesc);
     }
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("name", Type.TEXT);
     schema.addColumn("empid", Type.INT4);
     schema.addColumn("deptname", Type.TEXT);
 
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("deptname", Type.TEXT);
     schema2.addColumn("manager", Type.TEXT);
 
-    Schema schema3 = new Schema();
+    Schema schema3 = SchemaFactory.newV1();
     schema3.addColumn("deptname", Type.TEXT);
     schema3.addColumn("score", Type.INT4);
 
@@ -222,7 +222,7 @@ public class TestLogicalPlanner {
     testJsonSerDerObject(root);
     testCloneLogicalNode(root);
 
-    Schema expectedSchema = new Schema();
+    Schema expectedSchema = SchemaFactory.newV1();
     expectedSchema.addColumn("name", Type.TEXT);
     expectedSchema.addColumn("empid", Type.INT4);
     expectedSchema.addColumn("deptname", Type.TEXT);
@@ -291,7 +291,7 @@ public class TestLogicalPlanner {
 
   static Schema expectedJoinSchema;
   static {
-    expectedJoinSchema = new Schema();
+    expectedJoinSchema = SchemaFactory.newV1();
     expectedJoinSchema.addColumn("name", Type.TEXT);
     expectedJoinSchema.addColumn("deptname", Type.TEXT);
     expectedJoinSchema.addColumn("score", Type.INT4);
@@ -1290,7 +1290,7 @@ public class TestLogicalPlanner {
     String tableName = CatalogUtil.normalizeIdentifier("partitioned_table");
     String qualifiedTableName = CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, tableName);
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4)
       .addColumn("name", Type.TEXT)
       .addColumn("age", Type.INT4)
@@ -1299,7 +1299,7 @@ public class TestLogicalPlanner {
     KeyValueSet opts = new KeyValueSet();
     opts.set("file.delimiter", ",");
 
-    Schema partSchema = new Schema();
+    Schema partSchema = SchemaFactory.newV1();
     partSchema.addColumn("id", Type.INT4);
     partSchema.addColumn("name", Type.TEXT);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 c9e0c46..6479124 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
@@ -72,16 +72,16 @@ public class TestPlannerUtil {
     catalog.createTablespace(DEFAULT_TABLESPACE_NAME, "hdfs://localhost:1234/warehouse");
     catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("name", Type.TEXT);
     schema.addColumn("empid", CatalogUtil.newSimpleDataType(Type.INT4));
     schema.addColumn("deptname", Type.TEXT);
 
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("deptname", Type.TEXT);
     schema2.addColumn("manager", Type.TEXT);
 
-    Schema schema3 = new Schema();
+    Schema schema3 = SchemaFactory.newV1();
     schema3.addColumn("deptname", Type.TEXT);
     schema3.addColumn("score", CatalogUtil.newSimpleDataType(Type.INT4));
 
@@ -188,10 +188,10 @@ public class TestPlannerUtil {
 
   @Test
   public final void testGetJoinKeyPairs() {
-    Schema outerSchema = new Schema();
+    Schema outerSchema = SchemaFactory.newV1();
     outerSchema.addColumn("employee.id1", CatalogUtil.newSimpleDataType(Type.INT4));
     outerSchema.addColumn("employee.id2", CatalogUtil.newSimpleDataType(Type.INT4));
-    Schema innerSchema = new Schema();
+    Schema innerSchema = SchemaFactory.newV1();
     innerSchema.addColumn("people.fid1", CatalogUtil.newSimpleDataType(Type.INT4));
     innerSchema.addColumn("people.fid2", CatalogUtil.newSimpleDataType(Type.INT4));
 
@@ -250,10 +250,10 @@ public class TestPlannerUtil {
 
   @Test
   public final void testGetSortKeysFromJoinQual() {
-    Schema outerSchema = new Schema();
+    Schema outerSchema = SchemaFactory.newV1();
     outerSchema.addColumn("employee.id1", CatalogUtil.newSimpleDataType(Type.INT4));
     outerSchema.addColumn("employee.id2", CatalogUtil.newSimpleDataType(Type.INT4));
-    Schema innerSchema = new Schema();
+    Schema innerSchema = SchemaFactory.newV1();
     innerSchema.addColumn("people.fid1", CatalogUtil.newSimpleDataType(Type.INT4));
     innerSchema.addColumn("people.fid2", CatalogUtil.newSimpleDataType(Type.INT4));
 
@@ -286,10 +286,10 @@ public class TestPlannerUtil {
 
   @Test
   public final void testComparatorsFromJoinQual() {
-    Schema outerSchema = new Schema();
+    Schema outerSchema = SchemaFactory.newV1();
     outerSchema.addColumn("employee.id1", CatalogUtil.newSimpleDataType(Type.INT4));
     outerSchema.addColumn("employee.id2", CatalogUtil.newSimpleDataType(Type.INT4));
-    Schema innerSchema = new Schema();
+    Schema innerSchema = SchemaFactory.newV1();
     innerSchema.addColumn("people.fid1", CatalogUtil.newSimpleDataType(Type.INT4));
     innerSchema.addColumn("people.fid2", CatalogUtil.newSimpleDataType(Type.INT4));
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestUniformRangePartition.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestUniformRangePartition.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestUniformRangePartition.java
index 178af47..ece17c7 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestUniformRangePartition.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/TestUniformRangePartition.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.planner;
 
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.DatumFactory;
@@ -38,7 +39,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForINT2Asc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.INT2);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -68,7 +69,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForINT2Desc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.INT2);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -99,7 +100,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForINT4Asc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.INT4);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -129,7 +130,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForINT4Desc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.INT4);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -160,7 +161,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForINT8Asc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.INT8);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -190,7 +191,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForInt8Desc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.INT8);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -221,7 +222,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForFloat4Asc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.FLOAT4);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -251,7 +252,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForFloat4Desc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.FLOAT4);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -282,7 +283,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForFloat8Asc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.FLOAT8);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -312,7 +313,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForFloat8Desc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.FLOAT8);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -346,7 +347,7 @@ public class TestUniformRangePartition {
    */
   @Test
   public void testIncrementOfText() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("l_returnflag", Type.TEXT)
         .addColumn("l_linestatus", Type.TEXT);
 
@@ -393,7 +394,7 @@ public class TestUniformRangePartition {
    */
   @Test
   public void testIncrementOfText2() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("l_returnflag", Type.TEXT)
         .addColumn("l_linestatus", Type.TEXT);
 
@@ -438,7 +439,7 @@ public class TestUniformRangePartition {
    */
   @Test
   public void testIncrementOfText3() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("l_returnflag", Type.TEXT)
         .addColumn("l_linestatus", Type.TEXT)
         .addColumn("final", Type.TEXT);
@@ -471,7 +472,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testIncrementOfUnicode() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.TEXT);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -499,7 +500,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testIncrementOfUnicodeOneCharSinglePartition() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.TEXT);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -529,7 +530,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testIncrementOfUnicodeOneCharMultiPartition() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.TEXT);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -559,7 +560,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForUnicodeTextAsc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.TEXT);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -589,7 +590,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForUnicodeDiffLenBeginTextAsc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.TEXT);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -619,7 +620,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForUnicodeDiffLenEndTextAsc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.TEXT);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -649,7 +650,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForUnicodeTextDesc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.TEXT);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -680,7 +681,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForUnicodeDiffLenBeginTextDesc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.TEXT);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -711,7 +712,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForUnicodeDiffLenEndTextDesc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("col1", Type.TEXT);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -742,7 +743,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testIncrementOfInt8() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("l_orderkey", Type.INT8)
         .addColumn("l_linenumber", Type.INT8);
 
@@ -769,7 +770,7 @@ public class TestUniformRangePartition {
   }
 
   @Test public void testIncrementOfInt8AndFinal() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("l_orderkey", Type.INT8)
         .addColumn("l_linenumber", Type.INT8)
         .addColumn("final", Type.INT8);
@@ -802,7 +803,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testIncrementOfFloat8() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("l_orderkey", Type.FLOAT8)
         .addColumn("l_linenumber", Type.FLOAT8)
         .addColumn("final", Type.FLOAT8);
@@ -835,7 +836,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testIncrementOfInet4() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("l_orderkey", Type.INET4)
         .addColumn("l_linenumber", Type.INET4)
         .addColumn("final", Type.INET4);
@@ -868,7 +869,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartition() {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("l_returnflag", Type.TEXT);
     schema.addColumn("l_linestatus", Type.TEXT);
 
@@ -897,7 +898,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForOnePartNum() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("l_returnflag", Type.TEXT)
         .addColumn("l_linestatus", Type.TEXT);
 
@@ -919,7 +920,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForOnePartNumWithOneOfTheValueNull() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("l_returnflag", Type.TEXT)
         .addColumn("l_linestatus", Type.TEXT);
 
@@ -941,7 +942,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForMultipleChars() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("KEY1", Type.TEXT);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -970,7 +971,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForMultipleChars2() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("KEY1", Type.TEXT);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -1001,7 +1002,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForMultipleChars2Desc() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("KEY1", Type.TEXT);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -1033,7 +1034,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForMultipleCharsWithSameFirstChar() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("KEY1", Type.TEXT);
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
@@ -1064,7 +1065,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForOnePartNumWithBothValueNull() {
-    Schema schema = new Schema()
+    Schema schema = SchemaFactory.newV1()
         .addColumn("l_returnflag", Type.TEXT)
         .addColumn("l_linestatus", Type.TEXT);
 
@@ -1086,7 +1087,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionWithNull() {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("l_returnflag", Type.TEXT);
     schema.addColumn("l_linestatus", Type.TEXT);
 
@@ -1115,7 +1116,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionWithINET4() {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("l_returnflag", Type.INET4);
     schema.addColumn("l_linestatus", Type.INET4);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 30c46e5..580fe86 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
@@ -79,7 +79,7 @@ public class TestExternalSortExec {
     catalog.createDatabase(TajoConstants.DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf.setVar(TajoConf.ConfVars.WORKER_TEMPORAL_DIR, testDir.toString());
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("managerid", Type.INT4);
     schema.addColumn("empid", Type.INT4);
     schema.addColumn("deptname", Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 2e26a2a..40dc373 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
@@ -101,7 +101,7 @@ public class TestFullOuterHashJoinExec {
     //  7     | dep_7     | 1007
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
-    Schema dep3Schema = new Schema();
+    Schema dep3Schema = SchemaFactory.newV1();
     dep3Schema.addColumn("dep_id", Type.INT4);
     dep3Schema.addColumn("dep_name", Type.TEXT);
     dep3Schema.addColumn("loc_id", Type.INT4);
@@ -131,7 +131,7 @@ public class TestFullOuterHashJoinExec {
     //   102    |  job_102
     //   103    |  job_103
 
-    Schema job3Schema = new Schema();
+    Schema job3Schema = SchemaFactory.newV1();
     job3Schema.addColumn("job_id", Type.INT4);
     job3Schema.addColumn("job_title", Type.TEXT);
 
@@ -166,7 +166,7 @@ public class TestFullOuterHashJoinExec {
     //  21     |  fn_21     |  ln_21    |  1     | 123    | 101
     //  23     |  fn_23     |  ln_23    |  3     | 369    | 103
 
-    Schema emp3Schema = new Schema();
+    Schema emp3Schema = SchemaFactory.newV1();
     emp3Schema.addColumn("emp_id", Type.INT4);
     emp3Schema.addColumn("first_name", Type.TEXT);
     emp3Schema.addColumn("last_name", Type.TEXT);
@@ -222,7 +222,7 @@ public class TestFullOuterHashJoinExec {
     // -----------------------------------------------
     // this table is empty, no rows
 
-    Schema phone3Schema = new Schema();
+    Schema phone3Schema = SchemaFactory.newV1();
     phone3Schema.addColumn("emp_id", Type.INT4);
     phone3Schema.addColumn("phone_number", Type.TEXT);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 fd42b9a..9c426ad 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
@@ -105,7 +105,7 @@ public class TestFullOuterMergeJoinExec {
     //  7     | dep_7     | 1007
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
-    Schema dep3Schema = new Schema();
+    Schema dep3Schema = SchemaFactory.newV1();
     dep3Schema.addColumn("dep_id", Type.INT4);
     dep3Schema.addColumn("dep_name", Type.TEXT);
     dep3Schema.addColumn("loc_id", Type.INT4);
@@ -143,7 +143,7 @@ public class TestFullOuterMergeJoinExec {
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
     // 10     | dep_10    | 1010
-    Schema dep4Schema = new Schema();
+    Schema dep4Schema = SchemaFactory.newV1();
     dep4Schema.addColumn("dep_id", Type.INT4);
     dep4Schema.addColumn("dep_name", Type.TEXT);
     dep4Schema.addColumn("loc_id", Type.INT4);
@@ -175,7 +175,7 @@ public class TestFullOuterMergeJoinExec {
     //   102    |  job_102
     //   103    |  job_103
 
-    Schema job3Schema = new Schema();
+    Schema job3Schema = SchemaFactory.newV1();
     job3Schema.addColumn("job_id", Type.INT4);
     job3Schema.addColumn("job_title", Type.TEXT);
 
@@ -210,7 +210,7 @@ public class TestFullOuterMergeJoinExec {
     //  21     |  fn_21     |  ln_21    |  1     | 123    | 101
     //  23     |  fn_23     |  ln_23    |  3     | 369    | 103
 
-    Schema emp3Schema = new Schema();
+    Schema emp3Schema = SchemaFactory.newV1();
     emp3Schema.addColumn("emp_id", Type.INT4);
     emp3Schema.addColumn("first_name", Type.TEXT);
     emp3Schema.addColumn("last_name", Type.TEXT);
@@ -266,7 +266,7 @@ public class TestFullOuterMergeJoinExec {
     // -----------------------------------------------
     // this table is empty, no rows
 
-    Schema phone3Schema = new Schema();
+    Schema phone3Schema = SchemaFactory.newV1();
     phone3Schema.addColumn("emp_id", Type.INT4);
     phone3Schema.addColumn("phone_number", Type.TEXT);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 aeda300..f4257f1 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
@@ -78,7 +78,7 @@ public class TestHashAntiJoinExec {
     catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf = util.getConfiguration();
 
-    Schema employeeSchema = new Schema();
+    Schema employeeSchema = SchemaFactory.newV1();
     employeeSchema.addColumn("managerid", Type.INT4);
     employeeSchema.addColumn("empid", Type.INT4);
     employeeSchema.addColumn("memid", Type.INT4);
@@ -105,7 +105,7 @@ public class TestHashAntiJoinExec {
     employee = CatalogUtil.newTableDesc("default.employee", employeeSchema, employeeMeta, employeePath);
     catalog.createTable(employee);
 
-    Schema peopleSchema = new Schema();
+    Schema peopleSchema = SchemaFactory.newV1();
     peopleSchema.addColumn("empid", Type.INT4);
     peopleSchema.addColumn("fk_memid", Type.INT4);
     peopleSchema.addColumn("name", Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 2f4d66f..0731d9c 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
@@ -80,7 +80,7 @@ public class TestHashJoinExec {
     catalog.createDatabase(TajoConstants.DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf = util.getConfiguration();
 
-    Schema employeeSchema = new Schema();
+    Schema employeeSchema = SchemaFactory.newV1();
     employeeSchema.addColumn("managerid", Type.INT4);
     employeeSchema.addColumn("empid", Type.INT4);
     employeeSchema.addColumn("memid", Type.INT4);
@@ -104,7 +104,7 @@ public class TestHashJoinExec {
     employee = CatalogUtil.newTableDesc("default.employee", employeeSchema, employeeMeta, employeePath);
     catalog.createTable(employee);
 
-    Schema peopleSchema = new Schema();
+    Schema peopleSchema = SchemaFactory.newV1();
     peopleSchema.addColumn("empid", Type.INT4);
     peopleSchema.addColumn("fk_memid", Type.INT4);
     peopleSchema.addColumn("name", Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 2b50310..5244652 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
@@ -78,7 +78,7 @@ public class TestHashSemiJoinExec {
     catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf = util.getConfiguration();
 
-    Schema employeeSchema = new Schema();
+    Schema employeeSchema = SchemaFactory.newV1();
     employeeSchema.addColumn("managerid", Type.INT4);
     employeeSchema.addColumn("empid", Type.INT4);
     employeeSchema.addColumn("memid", Type.INT4);
@@ -105,7 +105,7 @@ public class TestHashSemiJoinExec {
     employee = CatalogUtil.newTableDesc("default.employee", employeeSchema, employeeMeta, employeePath);
     catalog.createTable(employee);
 
-    Schema peopleSchema = new Schema();
+    Schema peopleSchema = SchemaFactory.newV1();
     peopleSchema.addColumn("empid", Type.INT4);
     peopleSchema.addColumn("fk_memid", Type.INT4);
     peopleSchema.addColumn("name", Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 ab5f509..61ccd00 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
@@ -99,7 +99,7 @@ public class TestLeftOuterHashJoinExec {
     //  7     | dep_7     | 1007
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
-    Schema dep3Schema = new Schema();
+    Schema dep3Schema = SchemaFactory.newV1();
     dep3Schema.addColumn("dep_id", Type.INT4);
     dep3Schema.addColumn("dep_name", Type.TEXT);
     dep3Schema.addColumn("loc_id", Type.INT4);
@@ -129,7 +129,7 @@ public class TestLeftOuterHashJoinExec {
     //   102    |  job_102
     //   103    |  job_103
 
-    Schema job3Schema = new Schema();
+    Schema job3Schema = SchemaFactory.newV1();
     job3Schema.addColumn("job_id", Type.INT4);
     job3Schema.addColumn("job_title", Type.TEXT);
 
@@ -165,7 +165,7 @@ public class TestLeftOuterHashJoinExec {
     //  21     |  fn_21     |  ln_21    |  1     | 123    | 101
     //  23     |  fn_23     |  ln_23    |  3     | 369    | 103
 
-    Schema emp3Schema = new Schema();
+    Schema emp3Schema = SchemaFactory.newV1();
     emp3Schema.addColumn("emp_id", Type.INT4);
     emp3Schema.addColumn("first_name", Type.TEXT);
     emp3Schema.addColumn("last_name", Type.TEXT);
@@ -222,7 +222,7 @@ public class TestLeftOuterHashJoinExec {
     // -----------------------------------------------
     // this table is empty, no rows
 
-    Schema phone3Schema = new Schema();
+    Schema phone3Schema = SchemaFactory.newV1();
     phone3Schema.addColumn("emp_id", Type.INT4);
     phone3Schema.addColumn("phone_number", Type.TEXT);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 d297825..88018e9 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
@@ -78,7 +78,7 @@ public class TestMergeJoinExec {
     catalog.createDatabase(TajoConstants.DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf = util.getConfiguration();
 
-    Schema employeeSchema = new Schema();
+    Schema employeeSchema = SchemaFactory.newV1();
     employeeSchema.addColumn("managerid", Type.INT4);
     employeeSchema.addColumn("empid", Type.INT4);
     employeeSchema.addColumn("memid", Type.INT4);
@@ -108,7 +108,7 @@ public class TestMergeJoinExec {
     employee = CatalogUtil.newTableDesc("default.employee", employeeSchema, employeeMeta, employeePath);
     catalog.createTable(employee);
 
-    Schema peopleSchema = new Schema();
+    Schema peopleSchema = SchemaFactory.newV1();
     peopleSchema.addColumn("empid", Type.INT4);
     peopleSchema.addColumn("fk_memid", Type.INT4);
     peopleSchema.addColumn("name", Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 2528399..28d99b1 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
@@ -104,12 +104,12 @@ public class TestPhysicalPlanner {
       catalog.createFunction(funcDesc);
     }
 
-    Schema employeeSchema = new Schema();
+    Schema employeeSchema = SchemaFactory.newV1();
     employeeSchema.addColumn("name", Type.TEXT);
     employeeSchema.addColumn("empid", Type.INT4);
     employeeSchema.addColumn("deptname", Type.TEXT);
 
-    Schema scoreSchema = new Schema();
+    Schema scoreSchema = SchemaFactory.newV1();
     scoreSchema.addColumn("deptname", Type.TEXT);
     scoreSchema.addColumn("class", Type.TEXT);
     scoreSchema.addColumn("score", Type.INT4);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 15250a3..21a08bd 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
@@ -80,7 +80,7 @@ public class TestProgressExternalSortExec {
     catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf.setVar(TajoConf.ConfVars.WORKER_TEMPORAL_DIR, testDir.toString());
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("managerid", TajoDataTypes.Type.INT4);
     schema.addColumn("empid", TajoDataTypes.Type.INT4);
     schema.addColumn("deptname", TajoDataTypes.Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 9a7eaff..a5c54b8 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
@@ -93,7 +93,7 @@ public class TestRightOuterHashJoinExec {
     //  7     | dep_7     | 1007
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
-    Schema dep3Schema = new Schema();
+    Schema dep3Schema = SchemaFactory.newV1();
     dep3Schema.addColumn("dep_id", Type.INT4);
     dep3Schema.addColumn("dep_name", Type.TEXT);
     dep3Schema.addColumn("loc_id", Type.INT4);
@@ -124,7 +124,7 @@ public class TestRightOuterHashJoinExec {
     //   102    |  job_102
     //   103    |  job_103
 
-    Schema job3Schema = new Schema();
+    Schema job3Schema = SchemaFactory.newV1();
     job3Schema.addColumn("job_id", Type.INT4);
     job3Schema.addColumn("job_title", Type.TEXT);
 
@@ -160,7 +160,7 @@ public class TestRightOuterHashJoinExec {
     //  21     |  fn_21     |  ln_21    |  1     | 123    | 101
     //  23     |  fn_23     |  ln_23    |  3     | 369    | 103
 
-    Schema emp3Schema = new Schema();
+    Schema emp3Schema = SchemaFactory.newV1();
     emp3Schema.addColumn("emp_id", Type.INT4);
     emp3Schema.addColumn("first_name", Type.TEXT);
     emp3Schema.addColumn("last_name", Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 280722b..22946e9 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
@@ -104,7 +104,7 @@ public class TestRightOuterMergeJoinExec {
     //  7     | dep_7     | 1007
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
-    Schema dep3Schema = new Schema();
+    Schema dep3Schema = SchemaFactory.newV1();
     dep3Schema.addColumn("dep_id", Type.INT4);
     dep3Schema.addColumn("dep_name", Type.TEXT);
     dep3Schema.addColumn("loc_id", Type.INT4);
@@ -143,7 +143,7 @@ public class TestRightOuterMergeJoinExec {
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
     // 10     | dep_10    | 1010
-    Schema dep4Schema = new Schema();
+    Schema dep4Schema = SchemaFactory.newV1();
     dep4Schema.addColumn("dep_id", Type.INT4);
     dep4Schema.addColumn("dep_name", Type.TEXT);
     dep4Schema.addColumn("loc_id", Type.INT4);
@@ -176,7 +176,7 @@ public class TestRightOuterMergeJoinExec {
     //   102    |  job_102
     //   103    |  job_103
 
-    Schema job3Schema = new Schema();
+    Schema job3Schema = SchemaFactory.newV1();
     job3Schema.addColumn("job_id", Type.INT4);
     job3Schema.addColumn("job_title", Type.TEXT);
 
@@ -212,7 +212,7 @@ public class TestRightOuterMergeJoinExec {
     //  21     |  fn_21     |  ln_21    |  1     | 123    | 101
     //  23     |  fn_23     |  ln_23    |  3     | 369    | 103
 
-    Schema emp3Schema = new Schema();
+    Schema emp3Schema = SchemaFactory.newV1();
     emp3Schema.addColumn("emp_id", Type.INT4);
     emp3Schema.addColumn("first_name", Type.TEXT);
     emp3Schema.addColumn("last_name", Type.TEXT);
@@ -269,7 +269,7 @@ public class TestRightOuterMergeJoinExec {
     // -----------------------------------------------
     // this table is empty, no rows
 
-    Schema phone3Schema = new Schema();
+    Schema phone3Schema = SchemaFactory.newV1();
     phone3Schema.addColumn("emp_id", Type.INT4);
     phone3Schema.addColumn("phone_number", Type.TEXT);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 872815d..43cc719 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
@@ -81,7 +81,7 @@ public class TestSortExec {
     workDir = CommonTestingUtil.getTestDir(TEST_PATH);
     sm = TablespaceManager.getLocalFs();
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("managerid", Type.INT4);
     schema.addColumn("empid", Type.INT4);
     schema.addColumn("deptname", Type.TEXT);
@@ -156,7 +156,7 @@ public class TestSortExec {
    * Later it should be moved TestUniformPartitions.
    */
   public void testTAJO_946() {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("l_orderkey", Type.INT8);
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 df78667..2012362 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
@@ -84,7 +84,7 @@ public class TestSortIntersectExec {
     catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf = util.getConfiguration();
 
-    Schema employeeSchema1 = new Schema();
+    Schema employeeSchema1 = SchemaFactory.newV1();
     employeeSchema1.addColumn("managerid", TajoDataTypes.Type.INT4);
     employeeSchema1.addColumn("empid", TajoDataTypes.Type.INT4);
     employeeSchema1.addColumn("memid", TajoDataTypes.Type.INT4);
@@ -111,7 +111,7 @@ public class TestSortIntersectExec {
     employee1 = CatalogUtil.newTableDesc("default.employee1", employeeSchema1, employeeMeta1, employeePath1);
     catalog.createTable(employee1);
 
-    Schema employeeSchema2 = new Schema();
+    Schema employeeSchema2 = SchemaFactory.newV1();
     employeeSchema2.addColumn("managerid", TajoDataTypes.Type.INT4);
     employeeSchema2.addColumn("empid", TajoDataTypes.Type.INT4);
     employeeSchema2.addColumn("memid", TajoDataTypes.Type.INT4);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestTupleSorter.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestTupleSorter.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestTupleSorter.java
index 2f7330b..3485df4 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestTupleSorter.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestTupleSorter.java
@@ -24,6 +24,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
@@ -69,7 +70,7 @@ public class TestTupleSorter {
     Column col4 = new Column("col4", Type.INT8);
     Column col5 = new Column("col5", Type.INTERVAL);
 
-    Schema schema = new Schema(new Column[] {col0, col1, col2, col3, col4, col5});
+    Schema schema = SchemaFactory.newV1(new Column[] {col0, col1, col2, col3, col4, col5});
 
     long[] time1 = new long[ITERATION];
     long[] time2 = new long[ITERATION];

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestUnSafeTuple.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestUnSafeTuple.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestUnSafeTuple.java
index 48170f6..e2b865e 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestUnSafeTuple.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestUnSafeTuple.java
@@ -20,6 +20,7 @@ package org.apache.tajo.engine.planner.physical;
 
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.SchemaUtil;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
@@ -48,7 +49,7 @@ public class TestUnSafeTuple {
     Column col3 = new Column("col3", Type.FLOAT4);
     Column col4 = new Column("col4", Type.FLOAT8);
 
-    schema = new Schema(new Column[]{col0, col1, col2, col3, col4});
+    schema = SchemaFactory.newV1(new Column[]{col0, col1, col2, col3, col4});
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java
index ea4a7c8..b346d08 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestGroupByQuery.java
@@ -20,6 +20,7 @@ package org.apache.tajo.engine.query;
 
 import org.apache.tajo.*;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf.ConfVars;
 import org.apache.tajo.storage.StorageConstants;
@@ -420,7 +421,7 @@ public class TestGroupByQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.TEXT);
     schema.addColumn("code", Type.TEXT);
     schema.addColumn("qty", Type.INT4);
@@ -474,7 +475,7 @@ public class TestGroupByQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.TEXT);
     schema.addColumn("col2", Type.TEXT);
     schema.addColumn("col3", Type.TEXT);
@@ -504,7 +505,7 @@ public class TestGroupByQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.TEXT);
     schema.addColumn("col2", Type.TEXT);
 
@@ -691,7 +692,7 @@ public class TestGroupByQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.TEXT);
     schema.addColumn("col2", Type.TEXT);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestHBaseTable.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestHBaseTable.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestHBaseTable.java
index d4712dc..a179f88 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestHBaseTable.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestHBaseTable.java
@@ -37,6 +37,7 @@ import org.apache.tajo.IntegrationTest;
 import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
@@ -821,7 +822,7 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.TEXT);
     schema.addColumn("name", Type.TEXT);
     List<String> datas = new ArrayList<>();
@@ -877,7 +878,7 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.TEXT);
     schema.addColumn("name", Type.TEXT);
     List<String> datas = new ArrayList<>();
@@ -935,7 +936,7 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.TEXT);
     schema.addColumn("name", Type.TEXT);
     List<String> datas = new ArrayList<>();
@@ -993,7 +994,7 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id1", Type.TEXT);
     schema.addColumn("id2", Type.TEXT);
     schema.addColumn("name", Type.TEXT);
@@ -1050,7 +1051,7 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("name", Type.TEXT);
     List<String> datas = new ArrayList<>();
@@ -1106,7 +1107,7 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("rk", Type.TEXT);
     schema.addColumn("col2_key", Type.TEXT);
     schema.addColumn("col2_value", Type.TEXT);
@@ -1195,7 +1196,7 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("name", Type.TEXT);
     List<String> datas = new ArrayList<>();
@@ -1267,7 +1268,7 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.TEXT);
     schema.addColumn("name", Type.TEXT);
     List<String> datas = new ArrayList<>();
@@ -1388,7 +1389,7 @@ public class TestHBaseTable extends QueryTestCaseBase {
       tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
       tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
       schema.addColumn("id", Type.TEXT);
       schema.addColumn("name", Type.TEXT);
       schema.addColumn("comment", Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java
index 9b5b9ed..34f26a6 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestJoinQuery.java
@@ -26,10 +26,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.TajoTestingCluster;
-import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.TableDesc;
-import org.apache.tajo.catalog.TableMeta;
+import org.apache.tajo.catalog.*;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.conf.TajoConf.ConfVars;
 import org.apache.tajo.datum.Datum;
@@ -149,37 +146,37 @@ public class TestJoinQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("name", TajoDataTypes.Type.TEXT);
     String[] data = new String[]{"1|table11-1", "2|table11-2", "3|table11-3", "4|table11-4", "5|table11-5"};
     TajoTestingCluster.createTable("jointable11", schema, tableOptions, data, 2);
 
-    schema = new Schema();
+    schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("name", TajoDataTypes.Type.TEXT);
     data = new String[]{"1|table12-1", "2|table12-2"};
     TajoTestingCluster.createTable("jointable12", schema, tableOptions, data, 2);
 
-    schema = new Schema();
+    schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("name", TajoDataTypes.Type.TEXT);
     data = new String[]{"2|table13-2", "3|table13-3"};
     TajoTestingCluster.createTable("jointable13", schema, tableOptions, data);
 
-    schema = new Schema();
+    schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("name", TajoDataTypes.Type.TEXT);
     data = new String[]{"1|table14-1", "2|table14-2", "3|table14-3", "4|table14-4"};
     TajoTestingCluster.createTable("jointable14", schema, tableOptions, data);
 
-    schema = new Schema();
+    schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("name", TajoDataTypes.Type.TEXT);
     data = new String[]{};
     TajoTestingCluster.createTable("jointable15", schema, tableOptions, data);
 
-    schema = new Schema();
+    schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("name", TajoDataTypes.Type.TEXT);
     data = new String[]{"1000000|a", "1000001|b", "2|c", "3|d", "4|e"};

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestNullValues.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestNullValues.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestNullValues.java
index 791a819..2bca027 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestNullValues.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestNullValues.java
@@ -22,6 +22,7 @@ import org.apache.tajo.IntegrationTest;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.TpchTestBase;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.client.TajoClient;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.storage.StorageConstants;
@@ -58,7 +59,7 @@ public class TestNullValues {
   @Test
   public final void testIsNull() throws Exception {
     String [] table = new String[] {"nulltable1"};
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.INT4);
     schema.addColumn("col2", Type.TEXT);
     schema.addColumn("col3", Type.FLOAT4);
@@ -83,7 +84,7 @@ public class TestNullValues {
   @Test
   public final void testIsNotNull() throws Exception {
     String [] table = new String[] {"nulltable2"};
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.INT4);
     schema.addColumn("col2", Type.TEXT);
     Schema [] schemas = new Schema[] {schema};
@@ -108,7 +109,7 @@ public class TestNullValues {
   @Test
   public final void testIsNotNull2() throws Exception {
     String [] table = new String[] {"nulltable3"};
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.INT8);
     schema.addColumn("col2", Type.INT8);
     schema.addColumn("col3", Type.INT8);
@@ -138,7 +139,7 @@ public class TestNullValues {
   @Test
   public final void testIsNotNull3() throws Exception {
     String [] table = new String[] {"nulltable4"};
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.INT8);
     schema.addColumn("col2", Type.INT8);
     schema.addColumn("col3", Type.INT8);
@@ -251,7 +252,7 @@ public class TestNullValues {
 
   private ResultSet runNullTableQuery(String tableName, String query, TajoClient client) throws Exception {
     String [] table = new String[] {tableName};
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.INT4);
     schema.addColumn("col2", Type.TEXT);
     schema.addColumn("col3", Type.FLOAT4);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 a2dec50..f206e20 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
@@ -23,6 +23,7 @@ import org.apache.tajo.*;
 import org.apache.tajo.TajoProtos.QueryState;
 import org.apache.tajo.catalog.CatalogService;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.client.QueryStatus;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -498,7 +499,7 @@ public class TestSelectQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("name", Type.TEXT);
     String[] data = new String[]{ "1|table11-1", "2|table11-2", "3|table11-3", "4|table11-4", "5|table11-5" };

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java
index d889d34..582d0b0 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestSortQuery.java
@@ -20,6 +20,7 @@ package org.apache.tajo.engine.query;
 
 import org.apache.tajo.*;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf.ConfVars;
 import org.apache.tajo.storage.StorageConstants;
@@ -111,7 +112,7 @@ public class TestSortQuery extends QueryTestCaseBase {
       tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
       tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
       schema.addColumn("col1", Type.INT4);
       schema.addColumn("col2", Type.TEXT);
       String[] data = new String[]{
@@ -213,7 +214,7 @@ public class TestSortQuery extends QueryTestCaseBase {
       tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
       tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
       schema.addColumn("id", Type.INT4);
       schema.addColumn("name", Type.TEXT);
       String[] data = new String[]{
@@ -239,7 +240,7 @@ public class TestSortQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("name", Type.TEXT);
     String[] data = new String[]{ "1|111", "2|\\N", "3|333" };
@@ -276,7 +277,7 @@ public class TestSortQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("name", Type.TEXT);
     String[] data = new String[]{ "1|111", "2|\\N", "3|333" };
@@ -304,7 +305,7 @@ public class TestSortQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("name", Type.TEXT);
     String[] data = new String[]{ "1|111", "2|\\N", "3|333" };
@@ -332,7 +333,7 @@ public class TestSortQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("name", Type.TEXT);
     String[] data = new String[]{ "1|111", "2|\\N", "3|333" };
@@ -362,7 +363,7 @@ public class TestSortQuery extends QueryTestCaseBase {
       tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
       tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
       schema.addColumn("col1", Type.INT4);
       schema.addColumn("col2", Type.TEXT);
       String[] data = new String[]{
@@ -390,7 +391,7 @@ public class TestSortQuery extends QueryTestCaseBase {
       tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
       tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
       schema.addColumn("col1", Type.INT4);
       schema.addColumn("col2", Type.TEXT);
       String[] data = new String[]{

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestTablePartitions.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestTablePartitions.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestTablePartitions.java
index de2cbdf..3438759 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestTablePartitions.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestTablePartitions.java
@@ -24,10 +24,7 @@ import org.apache.hadoop.io.compress.CompressionCodec;
 import org.apache.hadoop.io.compress.CompressionCodecFactory;
 import org.apache.hadoop.io.compress.DeflateCodec;
 import org.apache.tajo.*;
-import org.apache.tajo.catalog.CatalogService;
-import org.apache.tajo.catalog.CatalogUtil;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.TableDesc;
+import org.apache.tajo.catalog.*;
 import org.apache.tajo.client.TajoClientUtil;
 import org.apache.tajo.exception.ReturnStateUtil;
 import org.apache.tajo.catalog.proto.CatalogProtos.PartitionDescProto;
@@ -1094,7 +1091,7 @@ public class TestTablePartitions extends QueryTestCaseBase {
       tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
       tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
       schema.addColumn("col1", TajoDataTypes.Type.TEXT);
       schema.addColumn("col2", TajoDataTypes.Type.TEXT);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestWindowQuery.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestWindowQuery.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestWindowQuery.java
index 9993992..19b8bbc 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestWindowQuery.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestWindowQuery.java
@@ -23,6 +23,7 @@ import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.storage.StorageConstants;
 import org.apache.tajo.util.KeyValueSet;
@@ -265,7 +266,7 @@ public class TestWindowQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("time", TajoDataTypes.Type.TIME);
     String[] data = new String[]{ "1|12:11:12", "2|10:11:13", "2|05:42:41" };
@@ -300,7 +301,7 @@ public class TestWindowQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("time", TajoDataTypes.Type.TIME);
     String[] data = new String[]{ "1|12:11:12", "2|10:11:13", "2|05:42:41" };
@@ -335,7 +336,7 @@ public class TestWindowQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("time", TajoDataTypes.Type.TIME);
     String[] data = new String[]{ "1|12:11:12", "2|10:11:13", "2|05:42:41" };
@@ -384,7 +385,7 @@ public class TestWindowQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("time", TajoDataTypes.Type.TIME);
     String[] data = new String[]{ "1|12:11:12", "2|10:11:13", "2|05:42:41" };
@@ -440,7 +441,7 @@ public class TestWindowQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("time", TajoDataTypes.Type.TIME);
     schema.addColumn("name", TajoDataTypes.Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/TestTupleUtil.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/TestTupleUtil.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/TestTupleUtil.java
index 4a3565e..5683c7a 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/TestTupleUtil.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/TestTupleUtil.java
@@ -20,6 +20,7 @@ package org.apache.tajo.engine.util;
 
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
@@ -38,7 +39,7 @@ import static org.junit.Assert.*;
 public class TestTupleUtil {
   @Test
   public final void testFixedSizeChar() {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.CHAR, 5);
 
     Tuple tuple = new VTuple(1);
@@ -56,7 +57,7 @@ public class TestTupleUtil {
 
   @Test
   public final void testToBytesAndToTuple() {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.BOOLEAN);
     schema.addColumn("col2", Type.BIT);
     schema.addColumn("col3", Type.CHAR);
@@ -97,7 +98,7 @@ public class TestTupleUtil {
     VTuple sTuple = new VTuple(7);
     VTuple eTuple = new VTuple(7);
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
 
     schema.addColumn("numByte", Type.BIT);
     schema.addColumn("numChar", Type.CHAR);
@@ -141,7 +142,7 @@ public class TestTupleUtil {
   @Test
   public void testBuildTupleFromPartitionPath() {
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("key1", Type.INT8);
     schema.addColumn("key2", Type.TEXT);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 01ae39c..25f0e61 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
@@ -28,6 +28,7 @@ import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.TpchTestBase;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -62,7 +63,7 @@ public class TestRowFile {
 
   @Test
   public void test() throws IOException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("age", Type.INT8);
     schema.addColumn("description", Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/RestTestUtils.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/RestTestUtils.java b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/RestTestUtils.java
deleted file mode 100644
index 7a5b38d..0000000
--- a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/RestTestUtils.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.tajo.ws.rs.resources;
-
-import java.lang.reflect.Type;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TimeZone;
-
-import org.apache.hadoop.fs.Path;
-import org.apache.tajo.catalog.TableMeta;
-import org.apache.tajo.catalog.json.FunctionAdapter;
-import org.apache.tajo.catalog.json.TableMetaAdapter;
-import org.apache.tajo.common.TajoDataTypes.DataType;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.function.Function;
-import org.apache.tajo.json.ClassNameSerializer;
-import org.apache.tajo.json.DataTypeAdapter;
-import org.apache.tajo.json.DatumAdapter;
-import org.apache.tajo.json.GsonSerDerAdapter;
-import org.apache.tajo.json.PathSerializer;
-import org.apache.tajo.json.TimeZoneGsonSerdeAdapter;
-import org.apache.tajo.plan.expr.EvalNode;
-import org.apache.tajo.plan.function.AggFunction;
-import org.apache.tajo.plan.function.GeneralFunction;
-import org.apache.tajo.plan.logical.LogicalNode;
-import org.apache.tajo.plan.serder.EvalNodeAdapter;
-import org.apache.tajo.plan.serder.LogicalNodeAdapter;
-
-public class RestTestUtils {
-  
-  public static Map<Type, GsonSerDerAdapter<?>> registerTypeAdapterMap() {
-    Map<Type, GsonSerDerAdapter<?>> adapters = new HashMap<>();
-    adapters.put(Path.class, new PathSerializer());
-    adapters.put(Class.class, new ClassNameSerializer());
-    adapters.put(LogicalNode.class, new LogicalNodeAdapter());
-    adapters.put(EvalNode.class, new EvalNodeAdapter());
-    adapters.put(TableMeta.class, new TableMetaAdapter());
-    adapters.put(Function.class, new FunctionAdapter());
-    adapters.put(GeneralFunction.class, new FunctionAdapter());
-    adapters.put(AggFunction.class, new FunctionAdapter());
-    adapters.put(Datum.class, new DatumAdapter());
-    adapters.put(DataType.class, new DataTypeAdapter());
-    adapters.put(TimeZone.class, new TimeZoneGsonSerdeAdapter());
-
-    return adapters;
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestClusterResource.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestClusterResource.java b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestClusterResource.java
index 52e586b..de0c5ba 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestClusterResource.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestClusterResource.java
@@ -30,6 +30,7 @@ import javax.ws.rs.core.GenericType;
 import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.conf.TajoConf.ConfVars;
+import org.apache.tajo.plan.serder.PlanGsonHelper;
 import org.apache.tajo.ws.rs.netty.gson.GsonFeature;
 import org.glassfish.jersey.client.ClientProperties;
 import org.glassfish.jersey.filter.LoggingFilter;
@@ -55,7 +56,7 @@ public class TestClusterResource extends QueryTestCaseBase {
     restServiceURI = new URI("http", null, address.getHostName(), address.getPort(), "/rest", null, null);
     clusterURI = new URI(restServiceURI + "/cluster");
     restClient = ClientBuilder.newBuilder()
-        .register(new GsonFeature(RestTestUtils.registerTypeAdapterMap()))
+        .register(new GsonFeature(PlanGsonHelper.registerAdapters()))
         .register(LoggingFilter.class)
         .property(ClientProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true)
         .property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, true)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestDatabasesResource.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestDatabasesResource.java b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestDatabasesResource.java
index 6ea95f8..614dc73 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestDatabasesResource.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestDatabasesResource.java
@@ -34,6 +34,7 @@ import javax.ws.rs.core.Response.Status;
 import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.conf.TajoConf.ConfVars;
+import org.apache.tajo.plan.serder.PlanGsonHelper;
 import org.apache.tajo.ws.rs.netty.gson.GsonFeature;
 import org.apache.tajo.ws.rs.requests.NewDatabaseRequest;
 import org.apache.tajo.ws.rs.responses.DatabaseInfoResponse;
@@ -61,7 +62,7 @@ public class TestDatabasesResource extends QueryTestCaseBase {
     restServiceURI = new URI("http", null, address.getHostName(), address.getPort(), "/rest", null, null);
     databasesURI = new URI(restServiceURI + "/databases");
     restClient = ClientBuilder.newBuilder()
-        .register(new GsonFeature(RestTestUtils.registerTypeAdapterMap()))
+        .register(new GsonFeature(PlanGsonHelper.registerAdapters()))
         .register(LoggingFilter.class)
         .property(ClientProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true)
         .property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, true)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestFunctionsResource.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestFunctionsResource.java b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestFunctionsResource.java
index db7b836..fb2d1d7 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestFunctionsResource.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestFunctionsResource.java
@@ -22,6 +22,7 @@ import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.conf.TajoConf.ConfVars;
 import org.apache.tajo.function.FunctionSignature;
+import org.apache.tajo.plan.serder.PlanGsonHelper;
 import org.apache.tajo.ws.rs.netty.gson.GsonFeature;
 import org.glassfish.jersey.client.ClientProperties;
 import org.glassfish.jersey.filter.LoggingFilter;
@@ -56,7 +57,7 @@ public class TestFunctionsResource extends QueryTestCaseBase {
     restServiceURI = new URI("http", null, address.getHostName(), address.getPort(), "/rest", null, null);
     functionsURI = new URI(restServiceURI + "/functions");
     restClient = ClientBuilder.newBuilder()
-        .register(new GsonFeature(RestTestUtils.registerTypeAdapterMap()))
+        .register(new GsonFeature(PlanGsonHelper.registerAdapters()))
         .register(LoggingFilter.class)
         .property(ClientProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true)
         .property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, true)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java
index 7fcb640..4638a8c 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java
@@ -25,6 +25,7 @@ import org.apache.tajo.conf.TajoConf.ConfVars;
 import org.apache.tajo.error.Errors.ResultCode;
 import org.apache.tajo.exception.ErrorUtil;
 import org.apache.tajo.master.QueryInfo;
+import org.apache.tajo.plan.serder.PlanGsonHelper;
 import org.apache.tajo.ws.rs.netty.gson.GsonFeature;
 import org.apache.tajo.ws.rs.requests.NewSessionRequest;
 import org.apache.tajo.ws.rs.requests.SubmitQueryRequest;
@@ -69,7 +70,7 @@ public class TestQueryResource extends QueryTestCaseBase {
     sessionsURI = new URI(restServiceURI + "/sessions");
     queriesURI = new URI(restServiceURI + "/queries");
     restClient = ClientBuilder.newBuilder()
-        .register(new GsonFeature(RestTestUtils.registerTypeAdapterMap()))
+        .register(new GsonFeature(PlanGsonHelper.registerAdapters()))
         .register(LoggingFilter.class)
         .property(ClientProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true)
         .property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, true)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java
index 331fed7..8b9c93d 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java
@@ -23,6 +23,7 @@ import org.apache.tajo.TajoConstants;
 import org.apache.tajo.conf.TajoConf.ConfVars;
 import org.apache.tajo.error.Errors.ResultCode;
 import org.apache.tajo.exception.ErrorUtil;
+import org.apache.tajo.plan.serder.PlanGsonHelper;
 import org.apache.tajo.storage.RowStoreUtil;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.ws.rs.netty.gson.GsonFeature;
@@ -80,7 +81,7 @@ public class TestQueryResultResource extends QueryTestCaseBase {
     sessionsURI = new URI(restServiceURI + "/sessions");
     queriesURI = new URI(restServiceURI + "/queries");
     restClient = ClientBuilder.newBuilder()
-        .register(new GsonFeature(RestTestUtils.registerTypeAdapterMap()))
+        .register(new GsonFeature(PlanGsonHelper.registerAdapters()))
         .register(LoggingFilter.class)
         .property(ClientProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true)
         .property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, true)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestSessionsResource.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestSessionsResource.java b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestSessionsResource.java
index 83da87b..3ddeb95 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestSessionsResource.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestSessionsResource.java
@@ -34,6 +34,7 @@ import javax.ws.rs.core.Response.Status;
 import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.conf.TajoConf.ConfVars;
+import org.apache.tajo.plan.serder.PlanGsonHelper;
 import org.apache.tajo.ws.rs.netty.gson.GsonFeature;
 import org.apache.tajo.ws.rs.requests.NewSessionRequest;
 import org.apache.tajo.ws.rs.responses.NewSessionResponse;
@@ -61,7 +62,7 @@ public class TestSessionsResource extends QueryTestCaseBase {
     restServiceURI = new URI("http", null, address.getHostName(), address.getPort(), "/rest", null, null);
     sessionsURI = new URI(restServiceURI + "/sessions");
     restClient = ClientBuilder.newBuilder()
-        .register(new GsonFeature(RestTestUtils.registerTypeAdapterMap()))
+        .register(new GsonFeature(PlanGsonHelper.registerAdapters()))
         .register(LoggingFilter.class)
         .property(ClientProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true)
         .property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, true)


[4/5] tajo git commit: TAJO-2099: Implement an Adapter for legacy Schema.

Posted by hy...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 fe4b4a7..c64fe43 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
@@ -181,7 +181,7 @@ public class TestCatalog {
   }
 
   private TableDesc createMockupTable(String databaseName, String tableName) throws IOException {
-    schema1 = new Schema();
+    schema1 = SchemaFactory.newV1();
     schema1.addColumn(FieldName1, Type.BLOB);
     schema1.addColumn(FieldName2, Type.INT4);
     schema1.addColumn(FieldName3, Type.INT8);
@@ -299,7 +299,7 @@ public class TestCatalog {
 	
 	@Test
 	public void testGetTable() throws Exception {
-		schema1 = new Schema();
+		schema1 = SchemaFactory.newV1();
 		schema1.addColumn(FieldName1, Type.BLOB);
 		schema1.addColumn(FieldName2, Type.INT4);
 		schema1.addColumn(FieldName3, Type.INT8);
@@ -361,18 +361,18 @@ public class TestCatalog {
     //      |- s8
     //  |- s9
 
-    Schema nestedSchema = new Schema();
+    Schema nestedSchema = SchemaFactory.newV1();
     nestedSchema.addColumn("s1", Type.INT8);
 
     nestedSchema.addColumn("s2", Type.INT8);
 
-    Schema s5 = new Schema();
+    Schema s5 = SchemaFactory.newV1();
     s5.addColumn("s6", Type.INT8);
 
-    Schema s7 = new Schema();
+    Schema s7 = SchemaFactory.newV1();
     s7.addColumn("s5", new TypeDesc(s5));
 
-    Schema s3 = new Schema();
+    Schema s3 = SchemaFactory.newV1();
     s3.addColumn("s4", Type.INT8);
     s3.addColumn("s7", new TypeDesc(s7));
     s3.addColumn("s8", Type.INT8);
@@ -398,18 +398,18 @@ public class TestCatalog {
     //      |- s3
     //  |- s4
 
-    Schema nestedSchema = new Schema();
+    Schema nestedSchema = SchemaFactory.newV1();
     nestedSchema.addColumn("s1", Type.INT8);
 
     nestedSchema.addColumn("s2", Type.INT8);
 
-    Schema s5 = new Schema();
+    Schema s5 = SchemaFactory.newV1();
     s5.addColumn("s6", Type.INT8);
 
-    Schema s7 = new Schema();
+    Schema s7 = SchemaFactory.newV1();
     s7.addColumn("s5", new TypeDesc(s5));
 
-    Schema s3 = new Schema();
+    Schema s3 = SchemaFactory.newV1();
     s3.addColumn("s4", Type.INT8);
     s3.addColumn("s7", new TypeDesc(s7));
     s3.addColumn("s8", Type.INT8);
@@ -426,7 +426,7 @@ public class TestCatalog {
   static Schema relationSchema;
 
   public static TableDesc prepareTable() throws IOException {
-    relationSchema = new Schema();
+    relationSchema = SchemaFactory.newV1();
     relationSchema.addColumn(DEFAULT_DATABASE_NAME + ".indexed.id", Type.INT4)
         .addColumn(DEFAULT_DATABASE_NAME + ".indexed.name", Type.TEXT)
         .addColumn(DEFAULT_DATABASE_NAME + ".indexed.age", Type.INT4)
@@ -625,7 +625,7 @@ public class TestCatalog {
 
   @Test
   public final void testAddAndDeleteTablePartitionByHash1() throws Exception {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4)
         .addColumn("name", Type.TEXT)
         .addColumn("age", Type.INT4)
@@ -637,7 +637,7 @@ public class TestCatalog {
     TableMeta meta = CatalogUtil.newTableMeta("TEXT", opts);
 
 
-    Schema partSchema = new Schema();
+    Schema partSchema = SchemaFactory.newV1();
     partSchema.addColumn("id", Type.INT4);
 
     PartitionMethodDesc partitionDesc =
@@ -665,7 +665,7 @@ public class TestCatalog {
 
   @Test
   public final void testAddAndDeleteTablePartitionByHash2() throws Exception {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4)
         .addColumn("name", Type.TEXT)
         .addColumn("age", Type.INT4)
@@ -676,7 +676,7 @@ public class TestCatalog {
     opts.set("file.delimiter", ",");
     TableMeta meta = CatalogUtil.newTableMeta("TEXT", opts);
 
-    Schema partSchema = new Schema();
+    Schema partSchema = SchemaFactory.newV1();
     partSchema.addColumn("id", Type.INT4);
     PartitionMethodDesc partitionDesc =
         new PartitionMethodDesc(DEFAULT_DATABASE_NAME, tableName,
@@ -703,7 +703,7 @@ public class TestCatalog {
 
   @Test
   public final void testAddAndDeleteTablePartitionByList() throws Exception {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4)
         .addColumn("name", Type.TEXT)
         .addColumn("age", Type.INT4)
@@ -714,7 +714,7 @@ public class TestCatalog {
     opts.set("file.delimiter", ",");
     TableMeta meta = CatalogUtil.newTableMeta("TEXT", opts);
 
-    Schema partSchema = new Schema();
+    Schema partSchema = SchemaFactory.newV1();
     partSchema.addColumn("id", Type.INT4);
     PartitionMethodDesc partitionDesc =
         new PartitionMethodDesc(DEFAULT_DATABASE_NAME, tableName,
@@ -740,7 +740,7 @@ public class TestCatalog {
 
   @Test
   public final void testAddAndDeleteTablePartitionByRange() throws Exception {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4)
         .addColumn("name", Type.TEXT)
         .addColumn("age", Type.INT4)
@@ -751,7 +751,7 @@ public class TestCatalog {
     opts.set("file.delimiter", ",");
     TableMeta meta = CatalogUtil.newTableMeta("TEXT", opts);
 
-    Schema partSchema = new Schema();
+    Schema partSchema = SchemaFactory.newV1();
     partSchema.addColumn("id", Type.INT4);
     PartitionMethodDesc partitionDesc =
         new PartitionMethodDesc(DEFAULT_DATABASE_NAME, tableName, CatalogProtos.PartitionType.RANGE,
@@ -777,7 +777,7 @@ public class TestCatalog {
 
   // TODO: This should be added at TAJO-1891
   public final void testAddAndDeleteTablePartitionByColumn() throws Exception {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4)
         .addColumn("name", Type.TEXT)
         .addColumn("age", Type.INT4)
@@ -789,7 +789,7 @@ public class TestCatalog {
     opts.set("file.delimiter", ",");
     TableMeta meta = CatalogUtil.newTableMeta("TEXT", opts);
 
-    Schema partSchema = new Schema();
+    Schema partSchema = SchemaFactory.newV1();
     partSchema.addColumn("id", Type.INT4);
     partSchema.addColumn("name", Type.TEXT);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 314dd8c..f3933ff 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
@@ -334,20 +334,20 @@ public class TestCatalogAgainstCaseSensitivity {
     String databaseName = "TestDatabase1";
     String tableName = "nested_Table";
 
-    Schema schema = new Schema(
+    Schema schema = SchemaFactory.newV1(
         new Column[]{
             new Column("CoL1", CatalogUtil.newSimpleDataType(Type.INT4)),
             new Column("CoL2", CatalogUtil.newSimpleDataType(Type.FLOAT4)),
             new Column("CoL3", CatalogUtil.newSimpleDataType(Type.TEXT)),
     });
 
-    Schema tableSchema = new Schema();
+    Schema tableSchema = SchemaFactory.newV1();
     tableSchema.addColumn("RecoRd1", new TypeDesc(schema));
     tableSchema.addColumn("CoL1", CatalogUtil.newSimpleDataType(Type.INT4));
     tableSchema.addColumn("CoL3", CatalogUtil.newSimpleDataType(Type.TEXT));
     tableSchema.addColumn("RecoRd2", new TypeDesc(schema));
     tableSchema.addColumn("RecoRd3", new TypeDesc(
-        new Schema(new Column[]{
+        SchemaFactory.newV1(new Column[]{
             new Column("CoL1", CatalogUtil.newSimpleDataType(Type.INT4)),
             new Column("RecoRd1", new TypeDesc(schema)),
         })

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogExceptions.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogExceptions.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogExceptions.java
index 5d40656..c151e3b 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogExceptions.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalogExceptions.java
@@ -115,7 +115,7 @@ public class TestCatalogExceptions {
   public void testCreateTableWithWrongUri() throws Exception {
     // TODO: currently, wrong uri does not occur any exception.
     String tableName = "wrongUri";
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn(CatalogUtil.buildFQName(tableName, "Column"), Type.BLOB);
     schema.addColumn(CatalogUtil.buildFQName(tableName, "column"), Type.INT4);
     schema.addColumn(CatalogUtil.buildFQName(tableName, "cOlumn"), Type.INT8);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestLinkedMetadataManager.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestLinkedMetadataManager.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestLinkedMetadataManager.java
index a065fa8..d381ebd 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestLinkedMetadataManager.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestLinkedMetadataManager.java
@@ -42,25 +42,25 @@ public class TestLinkedMetadataManager {
 
   static TableDesc TABLE1 = new TableDesc(
       "table1",
-      new Schema(new Column[]{new Column("c1", Type.INT8)}),
+      SchemaFactory.newV1(new Column[]{new Column("c1", Type.INT8)}),
       "TEXT", new KeyValueSet(), URI.create("http://space1/x/table1")
   );
 
   static TableDesc TABLE2 = new TableDesc(
       "table2",
-          new Schema(new Column[]{new Column("c1", Type.INT8)}),
+          SchemaFactory.newV1(new Column[]{new Column("c1", Type.INT8)}),
       "TEXT", new KeyValueSet(), URI.create("http://space1/x/table2")
   );
 
   static TableDesc TABLE3 = new TableDesc(
       "table3",
-      new Schema(new Column[]{new Column("c1", Type.INT8)}),
+      SchemaFactory.newV1(new Column[]{new Column("c1", Type.INT8)}),
       "TEXT", new KeyValueSet(), URI.create("http://space1/x/table3")
   );
 
   static TableDesc TABLE4 = new TableDesc(
       "table4",
-          new Schema(new Column[]{new Column("c1", Type.INT8)}),
+          SchemaFactory.newV1(new Column[]{new Column("c1", Type.INT8)}),
       "TEXT", new KeyValueSet(), URI.create("http://space1/x/table4")
   );
 
@@ -211,7 +211,7 @@ public class TestLinkedMetadataManager {
   public void testCreateTable() throws Exception {
     TableDesc tb = new TableDesc(
         "space1.errortable",
-        new Schema(),
+        SchemaFactory.newV1(),
         new TableMeta("x", new KeyValueSet()),
         URI.create("file:///"));
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 18640ed..3618f1f 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
@@ -30,6 +30,7 @@ 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;
@@ -374,7 +375,7 @@ public class QueryClientImpl implements QueryClient {
     if(response.hasResultSet()) {
       SerializedResultSet resultSet = response.getResultSet();
       return new TajoMemoryResultSet(queryId,
-          new Schema(resultSet.getSchema()),
+          SchemaFactory.newV1(resultSet.getSchema()),
           resultSet, getClientSideSessionVars());
     } else {
       return TajoClientUtil.createNullResultSet(queryId);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 baafbe8..733bcec 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
@@ -24,6 +24,7 @@ import org.apache.tajo.SessionVars;
 import org.apache.tajo.TajoProtos;
 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.exception.QueryNotFoundException;
 import org.apache.tajo.ipc.ClientProtos;
@@ -99,16 +100,16 @@ public class TajoClientUtil {
       // select substr('abc', 1, 2)
       ClientProtos.SerializedResultSet serializedResultSet = response.getResultSet();
       return new TajoMemoryResultSet(new QueryId(response.getQueryId()),
-          new Schema(serializedResultSet.getSchema()),
+          SchemaFactory.newV1(serializedResultSet.getSchema()),
           serializedResultSet,
           client.getClientSideSessionVars());
     }
   }
 
   public static final ResultSet NULL_RESULT_SET =
-      new TajoMemoryResultSet(QueryIdFactory.NULL_QUERY_ID, new Schema(), null, null);
+      new TajoMemoryResultSet(QueryIdFactory.NULL_QUERY_ID, SchemaFactory.newV1(), null, null);
 
   public static TajoMemoryResultSet createNullResultSet(QueryId queryId) {
-    return new TajoMemoryResultSet(queryId, new Schema(), null, null);
+    return new TajoMemoryResultSet(queryId, SchemaFactory.newV1(), null, null);
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java b/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java
index 9fba40a..6e7092b 100644
--- a/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java
+++ b/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.jdbc;
 
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.storage.Tuple;
 
@@ -35,7 +36,7 @@ public class TajoMetaDataResultSet extends TajoResultSetBase {
   }
 
   public TajoMetaDataResultSet(List<String> columns, List<Type> types, List<MetaDataTuple> values) {
-    super(null, new Schema(), null);
+    super(null, SchemaFactory.newV1(), null);
     int index = 0;
     if(columns != null) {
       for(String columnName: columns) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 3bfd34d..062db47 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
@@ -22,6 +22,7 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
@@ -35,7 +36,7 @@ public class BackendTestingUtil {
   public final static TableMeta mockupMeta;
 
   static {
-    mockupSchema = new Schema();
+    mockupSchema = SchemaFactory.newV1();
     mockupSchema.addColumn("deptname", Type.TEXT);
     mockupSchema.addColumn("score", Type.INT4);
     mockupMeta = CatalogUtil.newTableMeta("TEXT");

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java b/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java
index 1dd1459..d838b6a 100644
--- a/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java
+++ b/tajo-common/src/main/java/org/apache/tajo/json/CommonGsonHelper.java
@@ -37,8 +37,8 @@ public class CommonGsonHelper {
   private CommonGsonHelper() {
   }
 
-	private static Map<Type, GsonSerDerAdapter> registerAdapters() {
-    Map<Type, GsonSerDerAdapter> adapters = new HashMap<>();
+	private static Map<Type, GsonSerDerAdapter<?>> registerAdapters() {
+    Map<Type, GsonSerDerAdapter<?>> adapters = new HashMap<>();
     adapters.put(Datum.class, new DatumAdapter());
 
     return adapters;

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-common/src/main/java/org/apache/tajo/json/GsonHelper.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/GsonHelper.java b/tajo-common/src/main/java/org/apache/tajo/json/GsonHelper.java
index 8c6d891..eb73c89 100644
--- a/tajo-common/src/main/java/org/apache/tajo/json/GsonHelper.java
+++ b/tajo-common/src/main/java/org/apache/tajo/json/GsonHelper.java
@@ -27,14 +27,14 @@ public class GsonHelper {
   private final GsonBuilder builder;
   private final Gson gson;
 
-  public GsonHelper(Map<Type, GsonSerDerAdapter> adapters) {
+  public GsonHelper(Map<Type, GsonSerDerAdapter<?>> adapters) {
     builder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
     registerAdapters(builder, adapters);
     gson = builder.create();
   }
 
-  public static void registerAdapters(GsonBuilder builder, Map<Type, GsonSerDerAdapter> adapters) {
-    for (Map.Entry<Type, GsonSerDerAdapter> entry : adapters.entrySet()) {
+  public static void registerAdapters(GsonBuilder builder, Map<Type, GsonSerDerAdapter<?>> adapters) {
+    for (Map.Entry<Type, GsonSerDerAdapter<?>> entry : adapters.entrySet()) {
       try {
         builder.registerTypeAdapter(entry.getKey(), entry.getValue());
       } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 ec92884..51a017e 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
@@ -37,7 +37,7 @@ public class TestDDLBuilder {
   private static final PartitionMethodDesc partitionMethod1;
 
   static {
-    schema1 = new Schema();
+    schema1 = SchemaFactory.newV1();
     schema1.addColumn("name", TajoDataTypes.Type.BLOB);
     schema1.addColumn("addr", TajoDataTypes.Type.TEXT);
 
@@ -45,7 +45,7 @@ public class TestDDLBuilder {
     meta1.putProperty(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     meta1.putProperty(StorageConstants.COMPRESSION_CODEC, GzipCodec.class.getName());
 
-    Schema expressionSchema = new Schema();
+    Schema expressionSchema = SchemaFactory.newV1();
     expressionSchema.addColumn("key", TajoDataTypes.Type.INT4);
     expressionSchema.addColumn("key2", TajoDataTypes.Type.TEXT);
     partitionMethod1 = new PartitionMethodDesc(
@@ -67,14 +67,14 @@ public class TestDDLBuilder {
 
   @Test
   public void testBuildDDLQuotedTableName() throws Exception {
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("name", TajoDataTypes.Type.BLOB);
     schema2.addColumn("addr", TajoDataTypes.Type.TEXT);
     schema2.addColumn("FirstName", TajoDataTypes.Type.TEXT);
     schema2.addColumn("LastName", TajoDataTypes.Type.TEXT);
     schema2.addColumn("with", TajoDataTypes.Type.TEXT);
 
-    Schema expressionSchema2 = new Schema();
+    Schema expressionSchema2 = SchemaFactory.newV1();
     expressionSchema2.addColumn("BirthYear", TajoDataTypes.Type.INT4);
 
     PartitionMethodDesc partitionMethod2 = new PartitionMethodDesc(

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/client/TestCatalogAdminClientExceptions.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/client/TestCatalogAdminClientExceptions.java b/tajo-core-tests/src/test/java/org/apache/tajo/client/TestCatalogAdminClientExceptions.java
index 78fb45a..6abc3fb 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/client/TestCatalogAdminClientExceptions.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/client/TestCatalogAdminClientExceptions.java
@@ -23,6 +23,7 @@ import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.TpchTestBase;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.exception.*;
@@ -67,20 +68,20 @@ public class TestCatalogAdminClientExceptions extends QueryTestCaseBase {
 
   @Test(expected = UnavailableTableLocationException.class)
   public final void testCreateExternalTableUnavailableLocation() throws TajoException {
-    client.createExternalTable("table128237", new Schema(), URI.create("/tajo/test1bcd"),
+    client.createExternalTable("table128237", SchemaFactory.newV1(), URI.create("/tajo/test1bcd"),
         new TableMeta("TEXT", new KeyValueSet()));
   }
 
   @Test(expected = DuplicateTableException.class)
   public final void testCreateExternalTableDuplicated() throws TajoException {
-    client.createExternalTable("default.lineitem", new Schema(), URI.create("/"),
+    client.createExternalTable("default.lineitem", SchemaFactory.newV1(), URI.create("/"),
         new TableMeta("TEXT", new KeyValueSet()));
   }
 
   @Test(expected = InsufficientPrivilegeException.class)
   public final void testCreateExternalTableInsufficientPrivilege() throws TajoException {
     Path p = TajoConf.getWarehouseDir(conf);
-    client.createExternalTable("information_schema.table1237891", new Schema(), p.toUri(),
+    client.createExternalTable("information_schema.table1237891", SchemaFactory.newV1(), p.toUri(),
         new TableMeta("TEXT", new KeyValueSet()));
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 68104e7..cdb86a1 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
@@ -21,6 +21,7 @@ package org.apache.tajo.engine.codegen;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
@@ -30,7 +31,7 @@ import org.junit.Test;
 public class TestEvalCodeGenerator extends ExprTestBase {
   private static Schema schema;
   static {
-    schema = new Schema();
+    schema = SchemaFactory.newV1();
     schema.addColumn("col0", TajoDataTypes.Type.INT1);
     schema.addColumn("col1", TajoDataTypes.Type.INT2);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
@@ -65,7 +66,7 @@ public class TestEvalCodeGenerator extends ExprTestBase {
 
   @Test
   public void testNullHandling() throws TajoException {
-    schema = new Schema();
+    schema = SchemaFactory.newV1();
     schema.addColumn("col0", TajoDataTypes.Type.INT1);
     schema.addColumn("col1", TajoDataTypes.Type.INT2);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
@@ -105,7 +106,7 @@ public class TestEvalCodeGenerator extends ExprTestBase {
 
   @Test
   public void testComparison() throws TajoException {
-    Schema inetSchema = new Schema();
+    Schema inetSchema = SchemaFactory.newV1();
     inetSchema.addColumn("addr1", TajoDataTypes.Type.INET4);
     inetSchema.addColumn("addr2", TajoDataTypes.Type.INET4);
 
@@ -161,7 +162,7 @@ public class TestEvalCodeGenerator extends ExprTestBase {
 
   @Test
   public void testBetweenAsymmetric() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TajoDataTypes.Type.INT4);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
     testEval(schema, "table1", "0,", "select col1 between 1 and 3 from table1", new String[]{"f"});
@@ -195,7 +196,7 @@ public class TestEvalCodeGenerator extends ExprTestBase {
 
   @Test
   public void testBetweenSymmetric() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TajoDataTypes.Type.INT4);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
     testEval(schema, "table1", "0,", "select col1 between symmetric 1 and 3 from table1", new String[]{"f"});
@@ -230,7 +231,7 @@ public class TestEvalCodeGenerator extends ExprTestBase {
 
   @Test
   public void testUnary() throws TajoException {
-    schema = new Schema();
+    schema = SchemaFactory.newV1();
     schema.addColumn("col0", TajoDataTypes.Type.INT1);
     schema.addColumn("col1", TajoDataTypes.Type.INT2);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
@@ -302,7 +303,7 @@ public class TestEvalCodeGenerator extends ExprTestBase {
     testSimpleEval("select length('123456') as col1 ", new String[]{"6"});
 
     testEval(schema, "table1", "0,1,2,3,4.5,6.5", "select 'abc' || 'bbc'", new String [] {"abcbbc"});
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TajoDataTypes.Type.TEXT);
     schema.addColumn("col2", TajoDataTypes.Type.TEXT);
     testEval(schema, "table1", " trim, abc", "select ltrim(col1) || ltrim(col2) from table1",

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTree.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTree.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTree.java
index 9116635..0b33626 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTree.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/eval/TestEvalTree.java
@@ -21,6 +21,7 @@ package org.apache.tajo.engine.eval;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
@@ -42,7 +43,7 @@ public class TestEvalTree extends ExprTestBase {
     FieldEval e2 = new FieldEval("table1.score", CatalogUtil.newSimpleDataType(INT4)); // it indicates
     assertCloneEqual(e2);
 
-    Schema schema1 = new Schema();
+    Schema schema1 = SchemaFactory.newV1();
     schema1.addColumn("table1.id", INT4);
     schema1.addColumn("table1.score", INT4);
     
@@ -395,7 +396,7 @@ public class TestEvalTree extends ExprTestBase {
       assertEquals(caseWhenEval.bind(null, null).eval(null).asInt4(), 1);
     }
 
-    Schema schema = new Schema(new Column[]{new Column("test", TajoDataTypes.Type.INT4)});
+    Schema schema = SchemaFactory.newV1(new Column[]{new Column("test", TajoDataTypes.Type.INT4)});
     Tuple tuple = new VTuple(new Datum[]{DatumFactory.createText("aaa")});
     RegexPredicateEval regexEval = new RegexPredicateEval(false, new FieldEval("test",
         CatalogUtil.newSimpleDataType(TajoDataTypes.Type.INT4)), new ConstEval(DatumFactory.createText("a*")), false);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 6a659be..9192235 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
@@ -97,7 +97,7 @@ public class TestEvalTreeUtil {
     catalog.createTablespace(DEFAULT_TABLESPACE_NAME, "hdfs://localhost:1234/warehouse");
     catalog.createDatabase(TajoConstants.DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("name", TajoDataTypes.Type.TEXT);
     schema.addColumn("score", TajoDataTypes.Type.INT4);
     schema.addColumn("age", TajoDataTypes.Type.INT4);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 3a2de5b..c3cd0a0 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
@@ -20,6 +20,7 @@ package org.apache.tajo.engine.eval;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.exception.TajoException;
 import org.junit.Test;
@@ -86,7 +87,7 @@ public class TestPredicates extends ExprTestBase {
 
     testSimpleEval("select (not (1 > null)) is null;", new String[] {"t"});
 
-    Schema schema1 = new Schema();
+    Schema schema1 = SchemaFactory.newV1();
     schema1.addColumn("col1", INT4);
     schema1.addColumn("col2", INT4);
     schema1.addColumn("col3", INT4);
@@ -112,7 +113,7 @@ public class TestPredicates extends ExprTestBase {
   public void testComparisonEqual() throws TajoException {
 
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col0", TajoDataTypes.Type.INT1);
     schema.addColumn("col1", TajoDataTypes.Type.INT2);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
@@ -125,7 +126,7 @@ public class TestPredicates extends ExprTestBase {
 
     testEval(schema, "t1", "0,1,2,3,4.1,5.1,cmp,asm,", "SELECT col6 = 'cmp' from t1", new String [] {"t"});
 
-    Schema schema1 = new Schema();
+    Schema schema1 = SchemaFactory.newV1();
     schema1.addColumn("col1", INT4);
     schema1.addColumn("col2", INT4);
     schema1.addColumn("col3", INT4);
@@ -142,7 +143,7 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testComparisonNotEqual() throws TajoException {
-    Schema schema1 = new Schema();
+    Schema schema1 = SchemaFactory.newV1();
     schema1.addColumn("col1", INT4);
     schema1.addColumn("col2", INT4);
     schema1.addColumn("col3", INT4);
@@ -159,7 +160,7 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testComparisonLessThan() throws TajoException {
-    Schema schema1 = new Schema();
+    Schema schema1 = SchemaFactory.newV1();
     schema1.addColumn("col1", INT4);
     schema1.addColumn("col2", INT4);
     schema1.addColumn("col3", INT4);
@@ -176,7 +177,7 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testComparisonLessThanEqual() throws TajoException {
-    Schema schema1 = new Schema();
+    Schema schema1 = SchemaFactory.newV1();
     schema1.addColumn("col1", INT4);
     schema1.addColumn("col2", INT4);
     schema1.addColumn("col3", INT4);
@@ -193,7 +194,7 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testComparisonGreaterThan() throws TajoException {
-    Schema schema1 = new Schema();
+    Schema schema1 = SchemaFactory.newV1();
     schema1.addColumn("col1", INT4);
     schema1.addColumn("col2", INT4);
     schema1.addColumn("col3", INT4);
@@ -210,7 +211,7 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testComparisonGreaterThanEqual() throws TajoException {
-    Schema schema1 = new Schema();
+    Schema schema1 = SchemaFactory.newV1();
     schema1.addColumn("col1", INT4);
     schema1.addColumn("col2", INT4);
     schema1.addColumn("col3", INT4);
@@ -231,7 +232,7 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testBetween() throws TajoException {
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("col1", TEXT);
     schema2.addColumn("col2", TEXT);
     schema2.addColumn("col3", TEXT);
@@ -255,7 +256,7 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testBetween2() throws TajoException { // for TAJO-249
-    Schema schema3 = new Schema();
+    Schema schema3 = SchemaFactory.newV1();
     schema3.addColumn("date_a", INT4);
     schema3.addColumn("date_b", INT4);
     schema3.addColumn("date_c", INT4);
@@ -294,7 +295,7 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testInPredicateWithConstant() throws TajoException {
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("col1", TEXT);
     schema2.addColumn("col2", TEXT);
     schema2.addColumn("col3", TEXT);
@@ -319,7 +320,7 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testInPredicateWithSimpleExprs() throws TajoException {
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("col1", TEXT);
     schema2.addColumn("col2", INT4);
     schema2.addColumn("col3", TEXT);
@@ -343,7 +344,7 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testIsNullPredicate() throws TajoException {
-    Schema schema1 = new Schema();
+    Schema schema1 = SchemaFactory.newV1();
     schema1.addColumn("col1", INT4);
     schema1.addColumn("col2", INT4);
     testEval(schema1, "table1", "123,", "select col1 is null, col2 is null as a from table1",
@@ -354,7 +355,7 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testIsNullPredicateWithFunction() throws TajoException {
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("col1", TEXT);
     schema2.addColumn("col2", TEXT);
     testEval(schema2, "table1", "_123,", "select ltrim(col1, '_') is null, upper(col2) is null as a from table1",
@@ -393,7 +394,7 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testBooleanTestOnTable() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", BOOLEAN);
     schema.addColumn("col2", BOOLEAN);
     testEval(schema, "table1", "t,f", "select col1 is true, col2 is false from table1", new String [] {"t", "t"});

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 fe51aa4..2db826b 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
@@ -21,6 +21,7 @@ package org.apache.tajo.engine.eval;
 import org.apache.tajo.SessionVars;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.exception.UndefinedFunctionException;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.DatumFactory;
@@ -39,7 +40,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testQuotedIdentifiers() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("컬럼1", TEXT);
     schema.addColumn("컬럼2", TEXT);
     testEval(schema, "테이블1", "123,234", "select \"컬럼1\"::float, cast (\"컬럼2\" as float4) as a from \"테이블1\"",
@@ -93,7 +94,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testExplicitCast() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col0", INT1);
     schema.addColumn("col1", INT2);
     schema.addColumn("col2", INT4);
@@ -173,7 +174,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testImplicitCastForInt1() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col0", TajoDataTypes.Type.INT1);
     schema.addColumn("col1", TajoDataTypes.Type.INT2);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
@@ -275,7 +276,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testImplicitCastForInt2() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col0", TajoDataTypes.Type.INT1);
     schema.addColumn("col1", TajoDataTypes.Type.INT2);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
@@ -377,7 +378,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testImplicitCastForInt4() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col0", TajoDataTypes.Type.INT1);
     schema.addColumn("col1", TajoDataTypes.Type.INT2);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
@@ -480,7 +481,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testImplicitCastForInt8() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col0", TajoDataTypes.Type.INT1);
     schema.addColumn("col1", TajoDataTypes.Type.INT2);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
@@ -587,7 +588,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testImplicitCastForFloat4() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col0", TajoDataTypes.Type.INT1);
     schema.addColumn("col1", TajoDataTypes.Type.INT2);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
@@ -706,7 +707,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testImplicitCastForFloat8() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col0", TajoDataTypes.Type.INT1);
     schema.addColumn("col1", TajoDataTypes.Type.INT2);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
@@ -826,7 +827,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testSigned() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col0", TajoDataTypes.Type.INT1);
     schema.addColumn("col1", TajoDataTypes.Type.INT2);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
@@ -870,7 +871,7 @@ public class TestSQLExpression extends ExprTestBase {
     queryContext.put(SessionVars.TIMEZONE, "GMT-6");
     TimeZone tz = TimeZone.getTimeZone("GMT-6");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
 
@@ -902,7 +903,7 @@ public class TestSQLExpression extends ExprTestBase {
     testSimpleEval("select true", new String[] {"t"});
     testSimpleEval("select false", new String[]{"f"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     testEval(schema, "table1", "123,234", "select col1, col2 from table1 where true", new String[]{"123", "234"});

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestBuiltinFunctions.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestBuiltinFunctions.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestBuiltinFunctions.java
index 72fdd6f..ae2de77 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestBuiltinFunctions.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestBuiltinFunctions.java
@@ -23,6 +23,7 @@ import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.storage.StorageConstants;
 import org.apache.tajo.util.KeyValueSet;
@@ -53,7 +54,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value", TajoDataTypes.Type.INT8);
     String[] data = new String[]{ "1|-111", "2|\\N", "3|-333" };
@@ -79,7 +80,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("value", TajoDataTypes.Type.DATE);
     String[] data = new String[]{ "2014-01-02", "2014-12-01", "2015-01-01", "1999-08-09", "2000-03-01" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
@@ -103,7 +104,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("value", TajoDataTypes.Type.DATE);
     String[] data = new String[]{ "2014-01-02", "2014-12-01", "\\N", "\\N", "2000-03-01" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
@@ -127,7 +128,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("value", TajoDataTypes.Type.TIME);
     String[] data = new String[]{ "11:11:11", "23:12:50", "00:00:01", "09:59:59", "12:13:14" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
@@ -151,7 +152,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("value", TajoDataTypes.Type.TIME);
     String[] data = new String[]{ "11:11:11", "\\N", "\\N", "09:59:59", "12:13:14" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
@@ -175,7 +176,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("value", TajoDataTypes.Type.TIMESTAMP);
     String[] data = new String[]{ "1999-01-01 11:11:11", "2015-01-01 23:12:50", "2016-12-24 00:00:01", 
             "1977-05-04 09:59:59", "2002-11-21 12:13:14" };
@@ -200,7 +201,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("value", TajoDataTypes.Type.TIMESTAMP);
     String[] data = new String[]{ "1999-01-01 11:11:11", "2015-01-01 23:12:50", "\\N",
             "\\N", "2002-11-21 12:13:14" };
@@ -232,7 +233,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value", TajoDataTypes.Type.INT8);
     String[] data = new String[]{ "1|111", "2|\\N", "3|333" };
@@ -265,7 +266,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("name", TajoDataTypes.Type.TEXT);
     String[] data = new String[]{ "1|\\N", "2|\\N", "3|\\N" };
@@ -298,7 +299,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("name", TajoDataTypes.Type.TEXT);
     String[] data = new String[]{ "1|def", "2|\\N", "3|abc" };
@@ -359,7 +360,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value_int", TajoDataTypes.Type.INT4);
     schema.addColumn("value_long", TajoDataTypes.Type.INT8);
@@ -388,7 +389,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value_int", TajoDataTypes.Type.INT4);
     schema.addColumn("value_long", TajoDataTypes.Type.INT8);
@@ -417,7 +418,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value_int", TajoDataTypes.Type.INT4);
     schema.addColumn("value_long", TajoDataTypes.Type.INT8);
@@ -446,7 +447,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value_int", TajoDataTypes.Type.INT4);
     schema.addColumn("value_long", TajoDataTypes.Type.INT8);
@@ -475,7 +476,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value_int", TajoDataTypes.Type.INT4);
     schema.addColumn("value_long", TajoDataTypes.Type.INT8);
@@ -507,7 +508,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value_int", TajoDataTypes.Type.INT4);
     schema.addColumn("value_long", TajoDataTypes.Type.INT8);
@@ -539,7 +540,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value_int", TajoDataTypes.Type.INT4);
     schema.addColumn("value_long", TajoDataTypes.Type.INT8);
@@ -571,7 +572,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value_int", TajoDataTypes.Type.INT4);
     schema.addColumn("value_long", TajoDataTypes.Type.INT8);
@@ -603,7 +604,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value_int", TajoDataTypes.Type.INT4);
     schema.addColumn("value_long", TajoDataTypes.Type.INT8);
@@ -634,7 +635,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value_int", TajoDataTypes.Type.INT4);
     schema.addColumn("value_long", TajoDataTypes.Type.INT8);
@@ -665,7 +666,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value_int", TajoDataTypes.Type.INT4);
     schema.addColumn("value_long", TajoDataTypes.Type.INT8);
@@ -696,7 +697,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value_int", TajoDataTypes.Type.INT4);
     schema.addColumn("value_long", TajoDataTypes.Type.INT8);
@@ -757,11 +758,11 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
     
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     String[] data = new String[] {"1", "3", "2", "4"};
     TajoTestingCluster.createTable("rank_table1", schema, tableOptions, data, 1);
-    schema = new Schema();
+    schema = SchemaFactory.newV1();
     schema.addColumn("refid", TajoDataTypes.Type.INT4);
     schema.addColumn("value", TajoDataTypes.Type.TEXT);
     data = new String[] {"1|efgh", "2|abcd", "4|erjk", "8|dfef"};
@@ -795,7 +796,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", TajoDataTypes.Type.INT4);
     schema.addColumn("value_int", TajoDataTypes.Type.INT4);
     schema.addColumn("value_long", TajoDataTypes.Type.INT8);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 691579c..9a072ef 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
@@ -20,6 +20,7 @@ package org.apache.tajo.engine.function;
 
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.exception.UndefinedFunctionException;
 import org.apache.tajo.common.TajoDataTypes;
@@ -32,7 +33,7 @@ import static org.junit.Assert.fail;
 public class TestConditionalExpressions extends ExprTestBase {
   @Test
   public void testCaseWhens1() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TajoDataTypes.Type.INT1);
     schema.addColumn("col2", TajoDataTypes.Type.INT2);
     schema.addColumn("col3", TajoDataTypes.Type.INT4);
@@ -59,7 +60,7 @@ public class TestConditionalExpressions extends ExprTestBase {
 
   @Test
   public void testCaseWhensWithNullReturn() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TajoDataTypes.Type.TEXT);
     schema.addColumn("col2", TajoDataTypes.Type.TEXT);
 
@@ -73,7 +74,7 @@ public class TestConditionalExpressions extends ExprTestBase {
 
   @Test
   public void testCaseWhensWithCommonExpression() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TajoDataTypes.Type.INT4);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
     schema.addColumn("col3", TajoDataTypes.Type.INT4);
@@ -111,7 +112,7 @@ public class TestConditionalExpressions extends ExprTestBase {
 
   @Test
   public void testCaseWhensWithCommonExpressionAndNull() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TajoDataTypes.Type.INT4);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
     schema.addColumn("col3", TajoDataTypes.Type.INT4);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 9dd8653..dc9bd25 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
@@ -21,6 +21,7 @@ package org.apache.tajo.engine.function;
 
 import org.apache.tajo.SessionVars;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.TimestampDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
@@ -119,7 +120,7 @@ public class TestDateTimeFunctions extends ExprTestBase {
     TimeZone GMT = TimeZone.getTimeZone("GMT");
     TimeZone PST = TimeZone.getTimeZone("PST");
 
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("col1", TIMESTAMP);
     testEval(schema2, "table1",
         "1970-01-17 10:09:37",
@@ -135,7 +136,7 @@ public class TestDateTimeFunctions extends ExprTestBase {
         new String[]{"1970.0", "1.0", "17.0"});
 
     // Currently TIME type can be loaded with INT8 type.
-    Schema schema3 = new Schema();
+    Schema schema3 = SchemaFactory.newV1();
     schema3.addColumn("col1", TIME);
     testEval(schema3, "table1",
         "10:09:37.5",
@@ -150,7 +151,7 @@ public class TestDateTimeFunctions extends ExprTestBase {
         "select extract(hour from col1), extract(minute from col1), extract(second from col1) from table1;",
         new String[]{"18.0", "9.0", "37.5"});
 
-    Schema schema4 = new Schema();
+    Schema schema4 = SchemaFactory.newV1();
     schema4.addColumn("col1", DATE);
     testEval(schema4, "table1",
         "1970-01-17",
@@ -235,7 +236,7 @@ public class TestDateTimeFunctions extends ExprTestBase {
     TimeZone GMT = TimeZone.getTimeZone("GMT");
     TimeZone PST = TimeZone.getTimeZone("PST");
 
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("col1", TIMESTAMP);
 
     testEval(schema2, "table1",
@@ -251,7 +252,7 @@ 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", "18.0"});
 
-    Schema schema3 = new Schema();
+    Schema schema3 = SchemaFactory.newV1();
     schema3.addColumn("col1", TIME);
     testEval(schema3, "table1", "10:09:37.5",
         "select date_part('hour', col1), date_part('minute', col1), date_part('second', col1) from table1;",
@@ -263,7 +264,7 @@ public class TestDateTimeFunctions extends ExprTestBase {
         "select date_part('hour', col1), date_part('minute', col1), date_part('second', col1) from table1;",
         new String[]{"18.0", "9.0", "37.5"});
 
-    Schema schema4 = new Schema();
+    Schema schema4 = SchemaFactory.newV1();
     schema4.addColumn("col1", DATE);
     testEval(schema4, "table1",
         "1970-01-17",

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestMathFunctions.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestMathFunctions.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestMathFunctions.java
index a43e4d3..1c07388 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestMathFunctions.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestMathFunctions.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.function;
 
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
 import org.apache.tajo.exception.TajoException;
@@ -37,7 +38,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select round(-5.5) as col1 ", new String[]{"-6"});
     testSimpleEval("select round(-5.6) as col1 ", new String[]{"-6"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT8);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", FLOAT8);
@@ -45,7 +46,7 @@ public class TestMathFunctions extends ExprTestBase {
     testEval(schema, "table1", "1.0, 0.2, 0.4", "select round(col1 + col2 + col3) from table1",
         new String[]{"2"});
 
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("col1", INT4);
     schema2.addColumn("col2", INT8);
     schema2.addColumn("col3", FLOAT4);
@@ -65,7 +66,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select floor(-5.1) as col1 ", new String[]{"-6"});
     testSimpleEval("select floor(-5.6) as col1 ", new String[]{"-6"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT8);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", FLOAT8);
@@ -84,7 +85,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select ceil(-5.1) as col1 ", new String[]{"-5"});
     testSimpleEval("select ceil(-5.6) as col1 ", new String[]{"-5"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT8);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", FLOAT8);
@@ -103,7 +104,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select ceiling(-5.1) as col1 ", new String[]{"-5"});
     testSimpleEval("select ceiling(-5.6) as col1 ", new String[]{"-5"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT8);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", FLOAT8);
@@ -119,7 +120,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select sin(1.2) as col1 ", new String[]{"0.9320390859672263"});
     testSimpleEval("select sin(-0.5) as col1 ", new String[]{"-0.479425538604203"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT8);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", FLOAT8);
@@ -136,7 +137,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select cos(1.2) as col1 ", new String[]{"0.3623577544766736"});
     testSimpleEval("select cos(-0.5) as col1 ", new String[]{"0.8775825618903728"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT8);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", FLOAT8);
@@ -152,7 +153,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select tan(0.8) as col1 ", new String[]{"1.0296385570503641"});
     testSimpleEval("select tan(-0.5) as col1 ", new String[]{"-0.5463024898437905"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT8);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", FLOAT8);
@@ -168,7 +169,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select asin(0.8) as col1 ", new String[]{"0.9272952180016123"});
     testSimpleEval("select asin(-0.5) as col1 ", new String[]{"-0.5235987755982989"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT8);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", FLOAT8);
@@ -184,7 +185,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select acos(0.8) as col1 ", new String[]{"0.6435011087932843"});
     testSimpleEval("select acos(-0.5) as col1 ", new String[]{"2.0943951023931957"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT8);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", FLOAT8);
@@ -200,7 +201,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select atan(1.2) as col1 ", new String[]{"0.8760580505981934"});
     testSimpleEval("select atan(-0.5) as col1 ", new String[]{"-0.4636476090008061"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT8);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", FLOAT8);
@@ -217,7 +218,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select atan2(-0.5, 0.3) as col1 ", new String[]{"-1.0303768265243125"});
     testSimpleEval("select atan2(-0.2, -1.3) as col1 ", new String[]{"-2.988943325194528"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT8);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", FLOAT8);
@@ -233,7 +234,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select mod(200000000000,2) as col1 ", new String[]{"0"});
     testSimpleEval("select mod(2,200000000000) as col1 ", new String[]{"2"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", INT8);
     schema.addColumn("col2", INT8);
     schema.addColumn("col3", INT8);
@@ -249,7 +250,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select div(200000000000,2) as col1 ", new String[]{"100000000000"});
     testSimpleEval("select div(2,200000000000) as col1 ", new String[]{"0"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", INT8);
     schema.addColumn("col2", INT8);
     schema.addColumn("col3", INT8);
@@ -265,7 +266,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select sign(0.3) as col1 ", new String[]{"1.0"});
 
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT4);
     schema.addColumn("col2", FLOAT4);
     schema.addColumn("col3", FLOAT4);
@@ -274,7 +275,7 @@ public class TestMathFunctions extends ExprTestBase {
         new String[]{"1.0"});
 
 
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("col1", FLOAT8);
     schema2.addColumn("col2", FLOAT8);
     schema2.addColumn("col3", FLOAT8);
@@ -290,7 +291,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select sqrt(8.0) as col1 ", new String[]{"2.8284271247461903"});
 
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT4);
     schema.addColumn("col2", FLOAT4);
     schema.addColumn("col3", FLOAT4);
@@ -299,7 +300,7 @@ public class TestMathFunctions extends ExprTestBase {
         new String[]{"1.1401754564651765"});
 
 
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("col1", FLOAT8);
     schema2.addColumn("col2", FLOAT8);
     schema2.addColumn("col3", FLOAT8);
@@ -315,13 +316,13 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select exp(1.2) as col1 ", new String[]{String.valueOf(Math.exp(1.2d))});
 
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT4);
 
     testEval(schema, "table1", "1.123", "select exp(col1) from table1",
         new String[]{String.valueOf(Math.exp(1.123f))});
 
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("col1", FLOAT8);
 
     testEval(schema2, "table1", "1.123", "select exp(col1) from table1",
@@ -338,12 +339,12 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select abs(2.0) as col1 ", new String[]{"2.0"});
     testSimpleEval("select abs(-2.0) as col1 ", new String[]{"2.0"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT4);
     schema.addColumn("col2", FLOAT4);
     testEval(schema, "table1", "0.39,-0.39", "select abs(col1), abs(col2) from table1", new String[]{"0.39", "0.39"});
 
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("col1", FLOAT8);
     schema2.addColumn("col2", FLOAT8);
     testEval(schema2, "table1", "0.033312347,-0.033312347", "select abs(col1), abs(col2) from table1",
@@ -357,14 +358,14 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select cbrt(8.0) as col1 ", new String[]{"2.0"});
 
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT4);
     schema.addColumn("col2", FLOAT4);
     schema.addColumn("col3", FLOAT4);
     testEval(schema, "table1", "1.0, 0.2, 0.1", "select cbrt(col1 + col2 + col3) from table1",
         new String[]{"1.0913929030771317"});
 
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("col1", FLOAT8);
     schema2.addColumn("col2", FLOAT8);
     schema2.addColumn("col3", FLOAT8);
@@ -379,7 +380,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select degrees(2.7) as col1 ", new String[]{String.valueOf(Math.toDegrees(2.7))});
     testSimpleEval("select degrees(-0.8) as col1 ", new String[]{String.valueOf(Math.toDegrees(-0.8))});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT4);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", FLOAT8);
@@ -400,7 +401,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select pow(null,3.1) as col1 ", new String[]{NullDatum.get().toString()});
     testSimpleEval("select pow(20.1,null) as col1 ", new String[]{NullDatum.get().toString()});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT4);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", INT4);
@@ -420,7 +421,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select radians(2.7) as col1 ", new String[]{String.valueOf(Math.toRadians(2.7))});
     testSimpleEval("select radians(-0.8) as col1 ", new String[]{String.valueOf(Math.toRadians(-0.8))});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT4);
     schema.addColumn("col2", FLOAT8);
     schema.addColumn("col3", FLOAT8);
@@ -462,7 +463,7 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select round(1234567890.1234567,3) ", new String[]{"1.234567890123E9"});
     testSimpleEval("select round(1234567890.1234567,5) ", new String[]{"1.23456789012346E9"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", FLOAT8);
     schema.addColumn("col2", INT4);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 eb0bd96..0cfbe1c 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
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.function;
 
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
 import org.apache.tajo.exception.TajoException;
@@ -30,7 +31,7 @@ public class TestPatternMatchingPredicates extends ExprTestBase {
 
   @Test
   public void testLike() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
 
     // test for null values

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 751a243..dd40822 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
@@ -21,6 +21,7 @@ package org.apache.tajo.engine.function;
 
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
 import org.apache.tajo.exception.TajoException;
@@ -40,7 +41,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
 
   @Test
   public void testConcatenateOnExpressions() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", INT4);
     schema.addColumn("col3", FLOAT8);
@@ -61,7 +62,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
 
   @Test
   public void testLTrim() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
 
@@ -82,7 +83,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
 
   @Test
   public void testRTrim() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
 
@@ -103,7 +104,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
 
   @Test
   public void testTrim() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
 
@@ -131,7 +132,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select regexp_replace('abcdef', null, '--') as col1 ", new String[]{NullDatum.get().toString()});
     testSimpleEval("select regexp_replace('abcdef','bc', null) as col1 ", new String[]{NullDatum.get().toString()});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -164,7 +165,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select left('abcdef',-5) as col1 ", new String[]{"a"});
     testSimpleEval("select left('abcdef',-6) as col1 ", new String[]{""});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", INT4);
     schema.addColumn("col3", TEXT);
@@ -193,7 +194,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select right('abcdef',-5) as col1 ", new String[]{"f"});
     testSimpleEval("select right('abcdef',-6) as col1 ", new String[]{""});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", INT4);
     schema.addColumn("col3", TEXT);
@@ -210,7 +211,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select reverse('abcdef') as col1 ", new String[]{"fedcba"});
     testSimpleEval("select reverse('가') as col1 ", new String[]{"가"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -224,7 +225,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select repeat('가',3) as col1 ", new String[]{"가가가"});
     testSimpleEval("select repeat('a',2) as col1 ", new String[]{"aa"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -236,7 +237,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
   public void testUpper() throws TajoException {
     testSimpleEval("select upper('abcdef') as col1 ", new String[]{"ABCDEF"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -249,7 +250,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
   public void testLower() throws TajoException {
     testSimpleEval("select lower('ABCdEF') as col1 ", new String[]{"abcdef"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -262,7 +263,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
   public void testCharLength() throws TajoException {
     testSimpleEval("select char_length('123456') as col1 ", new String[]{"6"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -274,7 +275,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
   public void testLength() throws TajoException {
     testSimpleEval("select length('123456') as col1 ", new String[]{"6"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -287,7 +288,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select md5('1') as col1 ", new String[]{"c4ca4238a0b923820dcc509a6f75849b"});
     testSimpleEval("select md5('tajo') as col1 ", new String[]{"742721b3a79f71a9491681b8e8a7ce85"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -316,7 +317,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select to_hex(1234) as col1 ", new String[]{"4d2"});
     testSimpleEval("select to_hex(1023456788888888) as col1 ", new String[]{"3a2d41a583d38"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -330,7 +331,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select to_bin(10) as col1 ", new String[]{"1010"});
     testSimpleEval("select to_bin(1234) as col1 ", new String[]{"10011010010"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -344,7 +345,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select octet_length('1') as col1 ", new String[]{"1"});
     testSimpleEval("select octet_length('가') as col1 ", new String[]{"3"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -360,7 +361,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select split_part('1386577650.123', '.', 3) is null", new String[]{"t"});
 
     // null handling tests
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -389,7 +390,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select substr('abcdef', -1, 3) as col1 ", new String[]{"a"});
     testSimpleEval("select substr('abcdef', -1, 1) as col1 ", new String[]{""});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -432,7 +433,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select locate('abcdef', 'a', -1) as col1 ", new String[]{"0"});
     testSimpleEval("select locate('abcdef', 'a', -5) as col1 ", new String[]{"0"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -450,7 +451,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
   public void testBitLength() throws TajoException {
     testSimpleEval("select bit_length('123456') as col1 ", new String[]{"48"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -466,7 +467,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select strpos('일이삼사오육','삼사') as col1 ", new String[]{"3"});
     testSimpleEval("select strpos('일이삼사오육','일이삼') as col1 ", new String[]{"1"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -482,7 +483,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select strposb('일이삼사오육','삼사') as col1 ", new String[]{"7"});    //utf8 1 korean word = 3 chars
     testSimpleEval("select strposb('일이삼사오육','삼사일') as col1 ", new String[]{"0"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     schema.addColumn("col3", TEXT);
@@ -500,7 +501,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
   public void testAscii() throws TajoException {
     testSimpleEval("select ascii('abc') as col1 ", new String[]{"97"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     testEval(schema, "table1", "abc", "select ascii(col1) from table1",
             new String[]{"97"});
@@ -516,7 +517,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select chr(50) as col1 ", new String[]{"2"});
     testSimpleEval("select chr(64) as col1 ", new String[]{"@"});
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", INT4);
     testEval(schema, "table1", "65", "select chr(col1) from table1", new String[]{"A"});
     testEval(schema, "table1", "66", "select chr(col1) from table1", new String[]{"B"});
@@ -587,7 +588,7 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select find_in_set('딸기','사과,배,옥수수,감자,딸기,수박') as col1 ", new String[]{"5"});
 
     // null test
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TEXT);
     schema.addColumn("col2", TEXT);
     testEval(schema, "table1", "|crt,c,cr,c,def", "select find_in_set(col1, col2) is null from table1",

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestUserDefinedFunctions.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestUserDefinedFunctions.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestUserDefinedFunctions.java
index a179e74..f66c6bb 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestUserDefinedFunctions.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/function/TestUserDefinedFunctions.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.engine.function;
 
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
 import org.apache.tajo.exception.TajoException;
@@ -35,7 +36,7 @@ public class TestUserDefinedFunctions extends ExprTestBase {
 
   @Test
   public void testNullHandling2() throws TajoException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", BOOLEAN);
 
     testEval(schema, "table1", "", "select null_test() from table1", new String[]{NullDatum.get().toString()});


[5/5] tajo git commit: TAJO-2099: Implement an Adapter for legacy Schema.

Posted by hy...@apache.org.
TAJO-2099: Implement an Adapter for legacy Schema.

Closes #981


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

Branch: refs/heads/master
Commit: 8dad551ec54ee33f40bc355376ebcb4b370a5ada
Parents: 6826358
Author: Hyunsik Choi <hy...@apache.org>
Authored: Mon Mar 28 13:06:51 2016 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Mon Mar 28 13:06:51 2016 +0900

----------------------------------------------------------------------
 CHANGES                                         |   2 +
 .../org/apache/tajo/catalog/CatalogUtil.java    |   2 +-
 .../java/org/apache/tajo/catalog/IndexDesc.java |   2 +-
 .../java/org/apache/tajo/catalog/Schema.java    | 479 ++--------------
 .../org/apache/tajo/catalog/SchemaFactory.java  |  48 ++
 .../org/apache/tajo/catalog/SchemaLegacy.java   | 555 +++++++++++++++++++
 .../org/apache/tajo/catalog/SchemaUtil.java     |   8 +-
 .../java/org/apache/tajo/catalog/TableDesc.java |   4 +-
 .../tajo/catalog/json/CatalogGsonHelper.java    |   8 +-
 .../apache/tajo/catalog/json/SchemaAdapter.java |  57 ++
 .../catalog/partition/PartitionMethodDesc.java  |   3 +-
 .../org/apache/tajo/catalog/TestIndexDesc.java  |   2 +-
 .../org/apache/tajo/catalog/TestSchema.java     |  58 +-
 .../org/apache/tajo/catalog/TestTableDesc.java  |   4 +-
 .../org/apache/tajo/catalog/TestTableMeta.java  |   8 +-
 .../tajo/catalog/store/HiveCatalogStore.java    |   6 +-
 .../catalog/store/TestHiveCatalogStore.java     |  24 +-
 .../tajo/catalog/store/AbstractDBStore.java     |   6 +-
 .../apache/tajo/catalog/CatalogTestingUtil.java |   4 +-
 .../org/apache/tajo/catalog/TestCatalog.java    |  42 +-
 .../TestCatalogAgainstCaseSensitivity.java      |   6 +-
 .../tajo/catalog/TestCatalogExceptions.java     |   2 +-
 .../tajo/catalog/TestLinkedMetadataManager.java |  10 +-
 .../org/apache/tajo/client/QueryClientImpl.java |   3 +-
 .../org/apache/tajo/client/TajoClientUtil.java  |   7 +-
 .../apache/tajo/jdbc/TajoMetaDataResultSet.java |   3 +-
 .../org/apache/tajo/BackendTestingUtil.java     |   3 +-
 .../org/apache/tajo/json/CommonGsonHelper.java  |   4 +-
 .../java/org/apache/tajo/json/GsonHelper.java   |   6 +-
 .../apache/tajo/cli/tools/TestDDLBuilder.java   |   8 +-
 .../TestCatalogAdminClientExceptions.java       |   7 +-
 .../engine/codegen/TestEvalCodeGenerator.java   |  15 +-
 .../apache/tajo/engine/eval/TestEvalTree.java   |   5 +-
 .../tajo/engine/eval/TestEvalTreeUtil.java      |   2 +-
 .../apache/tajo/engine/eval/TestPredicates.java |  31 +-
 .../tajo/engine/eval/TestSQLExpression.java     |  23 +-
 .../engine/function/TestBuiltinFunctions.java   |  51 +-
 .../function/TestConditionalExpressions.java    |   9 +-
 .../engine/function/TestDateTimeFunctions.java  |  13 +-
 .../tajo/engine/function/TestMathFunctions.java |  57 +-
 .../function/TestPatternMatchingPredicates.java |   3 +-
 .../TestStringOperatorsAndFunctions.java        |  53 +-
 .../function/TestUserDefinedFunctions.java      |   3 +-
 .../engine/planner/TestJoinOrderAlgorithm.java  |   8 +-
 .../engine/planner/TestLogicalOptimizer.java    |   6 +-
 .../tajo/engine/planner/TestLogicalPlanner.java |  14 +-
 .../tajo/engine/planner/TestPlannerUtil.java    |  18 +-
 .../planner/TestUniformRangePartition.java      |  73 +--
 .../planner/physical/TestExternalSortExec.java  |   2 +-
 .../physical/TestFullOuterHashJoinExec.java     |   8 +-
 .../physical/TestFullOuterMergeJoinExec.java    |  10 +-
 .../planner/physical/TestHashAntiJoinExec.java  |   4 +-
 .../planner/physical/TestHashJoinExec.java      |   4 +-
 .../planner/physical/TestHashSemiJoinExec.java  |   4 +-
 .../physical/TestLeftOuterHashJoinExec.java     |   8 +-
 .../planner/physical/TestMergeJoinExec.java     |   4 +-
 .../planner/physical/TestPhysicalPlanner.java   |   4 +-
 .../physical/TestProgressExternalSortExec.java  |   2 +-
 .../physical/TestRightOuterHashJoinExec.java    |   6 +-
 .../physical/TestRightOuterMergeJoinExec.java   |  10 +-
 .../engine/planner/physical/TestSortExec.java   |   4 +-
 .../planner/physical/TestSortIntersectExec.java |   4 +-
 .../planner/physical/TestTupleSorter.java       |   3 +-
 .../planner/physical/TestUnSafeTuple.java       |   3 +-
 .../tajo/engine/query/TestGroupByQuery.java     |   9 +-
 .../tajo/engine/query/TestHBaseTable.java       |  19 +-
 .../apache/tajo/engine/query/TestJoinQuery.java |  17 +-
 .../tajo/engine/query/TestNullValues.java       |  11 +-
 .../tajo/engine/query/TestSelectQuery.java      |   3 +-
 .../apache/tajo/engine/query/TestSortQuery.java |  17 +-
 .../tajo/engine/query/TestTablePartitions.java  |   7 +-
 .../tajo/engine/query/TestWindowQuery.java      |  11 +-
 .../apache/tajo/engine/util/TestTupleUtil.java  |   9 +-
 .../org/apache/tajo/storage/TestRowFile.java    |   3 +-
 .../tajo/ws/rs/resources/RestTestUtils.java     |  64 ---
 .../ws/rs/resources/TestClusterResource.java    |   3 +-
 .../ws/rs/resources/TestDatabasesResource.java  |   3 +-
 .../ws/rs/resources/TestFunctionsResource.java  |   3 +-
 .../tajo/ws/rs/resources/TestQueryResource.java |   3 +-
 .../rs/resources/TestQueryResultResource.java   |   3 +-
 .../ws/rs/resources/TestSessionsResource.java   |   3 +-
 .../ws/rs/resources/TestTablesResource.java     |   3 +-
 .../java/org/apache/tajo/benchmark/TPCH.java    |  23 +-
 .../apache/tajo/engine/json/CoreGsonHelper.java |  24 +-
 .../tajo/engine/planner/global/DataChannel.java |   3 +-
 .../global/builder/DistinctGroupbyBuilder.java  |   3 +-
 .../planner/physical/BSTIndexScanExec.java      |   5 +-
 .../planner/physical/ColPartitionStoreExec.java |   7 +-
 .../engine/planner/physical/SeqScanExec.java    |   2 +-
 .../engine/planner/physical/WindowAggExec.java  |   5 +-
 .../tajo/master/TajoMasterClientService.java    |   2 +-
 .../exec/ExplainPlanPreprocessorForTest.java    |   3 +-
 .../apache/tajo/master/exec/QueryExecutor.java  |   2 +-
 .../apache/tajo/querymaster/Repartitioner.java  |   2 +-
 .../org/apache/tajo/ws/rs/TajoRestService.java  |  43 +-
 .../apache/tajo/jdbc/TajoDatabaseMetaData.java  |   2 +-
 .../org/apache/tajo/jdbc/TestResultSet.java     |   4 +-
 .../org/apache/tajo/plan/LogicalPlanner.java    |  14 +-
 .../org/apache/tajo/plan/expr/EvalTreeUtil.java |   3 +-
 .../function/python/PythonScriptEngine.java     |  16 +-
 .../tajo/plan/logical/CreateTableNode.java      |   3 +-
 .../apache/tajo/plan/logical/InsertNode.java    |   7 +-
 .../org/apache/tajo/plan/logical/ScanNode.java  |   7 +-
 .../plan/rewrite/SelfDescSchemaBuildPhase.java  |   4 +-
 .../tajo/plan/rewrite/rules/IndexScanInfo.java  |   3 +-
 .../rewrite/rules/PartitionedTableRewriter.java |   2 +-
 .../plan/serder/LogicalNodeDeserializer.java    |  11 +-
 .../apache/tajo/plan/serder/PlanGsonHelper.java |   7 +-
 .../org/apache/tajo/plan/util/PlannerUtil.java  |   4 +-
 .../org/apache/tajo/plan/TestLogicalNode.java   |   3 +-
 .../tajo/storage/BaseTupleComparator.java       |   3 +-
 .../org/apache/tajo/storage/MergeScanner.java   |   3 +-
 .../org/apache/tajo/storage/TupleRange.java     |   3 +-
 .../org/apache/tajo/storage/TestLazyTuple.java  |   5 +-
 .../tajo/storage/TestTupleComparator.java       |   7 +-
 .../tajo/storage/hbase/TestColumnMapping.java   |   3 +-
 .../apache/tajo/storage/index/bst/BSTIndex.java |   3 +-
 .../tajo/storage/parquet/ParquetScanner.java    |   3 +-
 .../storage/parquet/TajoSchemaConverter.java    |   3 +-
 .../storage/thirdparty/orc/OrcRecordReader.java |   3 +-
 .../tajo/storage/TestCompressionStorages.java   |   3 +-
 .../tajo/storage/TestDelimitedTextFile.java     |   3 +-
 .../apache/tajo/storage/TestFileSystems.java    |   3 +-
 .../apache/tajo/storage/TestFileTablespace.java |   9 +-
 .../org/apache/tajo/storage/TestLineReader.java |   9 +-
 .../apache/tajo/storage/TestMergeScanner.java   |   5 +-
 .../org/apache/tajo/storage/TestStorages.java   |  51 +-
 .../apache/tajo/storage/index/TestBSTIndex.java |  24 +-
 .../index/TestSingleCSVFileBSTIndex.java        |   6 +-
 .../apache/tajo/storage/json/TestJsonSerDe.java |   5 +-
 .../tajo/storage/parquet/TestReadWrite.java     |   3 +-
 .../storage/parquet/TestSchemaConverter.java    |   5 +-
 .../tajo/storage/raw/TestDirectRawFile.java     |   7 +-
 .../storage/jdbc/JdbcMetadataProviderBase.java  |   2 +-
 134 files changed, 1302 insertions(+), 1119 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 3c6bcaf..971d8d8 100644
--- a/CHANGES
+++ b/CHANGES
@@ -8,6 +8,8 @@ Release 0.12.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-2099: Implement an Adapter for the legacy Schema. (hyunsik)
+
     TAJO-2091: Error or progress update should use stderr instead of stdout. 
     (hyunsik)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 94e8157..76990f2 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
@@ -351,7 +351,7 @@ public class CatalogUtil {
   * @return
   */
   public static SchemaProto getQualfiedSchema(String tableName, SchemaProto schema) {
-    Schema restored = new Schema(schema);
+    Schema restored = SchemaFactory.newV1(schema);
     restored.setQualifier(tableName);
     return restored.getProto();
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/IndexDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/IndexDesc.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/IndexDesc.java
index 9f64913..ad038e8 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/IndexDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/IndexDesc.java
@@ -58,7 +58,7 @@ public class IndexDesc implements ProtoObject<IndexDescProto>, Cloneable {
           proto.getIndexName(), new URI(proto.getIndexPath()),
           keySortSpecs,
           proto.getIndexMethod(), proto.getIsUnique(), proto.getIsClustered(),
-          new Schema(proto.getTargetRelationSchema()));
+          SchemaFactory.newV1(proto.getTargetRelationSchema()));
     } catch (URISyntaxException e) {
       e.printStackTrace();
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
index 9574f12..1b4c1eb 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/Schema.java
@@ -18,113 +18,16 @@
 
 package org.apache.tajo.catalog;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableList;
-import com.google.gson.annotations.Expose;
-import org.apache.tajo.catalog.SchemaUtil.ColumnVisitor;
-import org.apache.tajo.catalog.json.CatalogGsonHelper;
-import org.apache.tajo.catalog.proto.CatalogProtos.ColumnProto;
 import org.apache.tajo.catalog.proto.CatalogProtos.SchemaProto;
 import org.apache.tajo.common.ProtoObject;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
-import org.apache.tajo.exception.DuplicateColumnException;
-import org.apache.tajo.exception.TajoRuntimeException;
 import org.apache.tajo.json.GsonObject;
-import org.apache.tajo.util.StringUtils;
 
-import java.util.*;
+import java.util.Collection;
+import java.util.List;
 
-public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
-
-	@Expose protected List<Column> fields = null;
-	@Expose protected Map<String, Integer> fieldsByQualifiedName = null;
-  @Expose protected Map<String, List<Integer>> fieldsByName = null;
-
-	public Schema() {
-    init();
-	}
-
-  /**
-   * This Schema constructor restores a serialized schema into in-memory Schema structure.
-   * A serialized schema is an ordered list in depth-first order over a nested schema.
-   * This constructor transforms the list into a tree-like structure.
-   *
-   * @param proto
-   */
-	public Schema(SchemaProto proto) {
-    init();
-
-    List<Column> toBeAdded = new ArrayList<>();
-    for (int i = 0; i < proto.getFieldsCount(); i++) {
-      deserializeColumn(toBeAdded, proto.getFieldsList(), i);
-    }
-
-    for (Column c : toBeAdded) {
-      addColumn(c);
-    }
-  }
-
-  /**
-   * This method transforms a list of ColumnProtos into a schema tree.
-   * It assumes that <code>protos</code> contains a list of ColumnProtos in the depth-first order.
-   *
-   * @param tobeAdded
-   * @param protos
-   * @param serializedColumnIndex
-   */
-  private static void deserializeColumn(List<Column> tobeAdded, List<ColumnProto> protos, int serializedColumnIndex) {
-    ColumnProto columnProto = protos.get(serializedColumnIndex);
-    if (columnProto.getDataType().getType() == Type.RECORD) {
-
-      // Get the number of child fields
-      int childNum = columnProto.getDataType().getNumNestedFields();
-      // where is start index of nested fields?
-      int childStartIndex = tobeAdded.size() - childNum;
-      // Extract nested fields
-      List<Column> nestedColumns = new ArrayList<>(tobeAdded.subList(childStartIndex, childStartIndex + childNum));
-
-      // Remove nested fields from the the current level
-      for (int i = 0; i < childNum; i++) {
-        tobeAdded.remove(tobeAdded.size() - 1);
-      }
-
-      // Add the nested fields to the list as a single record column
-      tobeAdded.add(new Column(columnProto.getName(), new TypeDesc(new Schema(nestedColumns))));
-    } else {
-      tobeAdded.add(new Column(protos.get(serializedColumnIndex)));
-    }
-  }
-
-	public Schema(Schema schema) {
-	  this();
-
-		this.fields.addAll(schema.fields);
-		this.fieldsByQualifiedName.putAll(schema.fieldsByQualifiedName);
-    this.fieldsByName.putAll(schema.fieldsByName);
-	}
-
-  public Schema(Column [] columns) {
-    init();
-
-    for(Column c : columns) {
-      addColumn(c);
-    }
-  }
-
-	public Schema(Iterable<Column> columns) {
-    init();
-
-    for(Column c : columns) {
-      addColumn(c);
-    }
-  }
-
-  private void init() {
-    this.fields = new ArrayList<>();
-    this.fieldsByQualifiedName = new HashMap<>();
-    this.fieldsByName = new HashMap<>();
-  }
+public interface Schema extends ProtoObject<SchemaProto>, Cloneable, GsonObject {
 
   /**
    * Set a qualifier to this schema.
@@ -132,45 +35,15 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
    *
    * @param qualifier The qualifier
    */
-  public void setQualifier(String qualifier) {
-    // only change root fields, and must keep each nested field simple name
-    List<Column> columns = getRootColumns();
-
-    fields.clear();
-    fieldsByQualifiedName.clear();
-    fieldsByName.clear();
-
-    Column newColumn;
-    for (Column c : columns) {
-      newColumn = new Column(qualifier + "." + c.getSimpleName(), c.typeDesc);
-      addColumn(newColumn);
-    }
-  }
+  void setQualifier(String qualifier);
 	
-	public int size() {
-		return this.fields.size();
-	}
+	int size();
 
-  public Column getColumn(int id) {
-    return fields.get(id);
-  }
+  Column getColumn(int id);
 
-  public Column getColumn(Column column) {
-    int idx = getIndex(column);
-    return idx >= 0 ? fields.get(idx) : null;
-  }
+  Column getColumn(Column column);
 
-  public int getIndex(Column column) {
-    if (!contains(column)) {
-      return -1;
-    }
-
-    if (column.hasQualifier()) {
-      return fieldsByQualifiedName.get(column.getQualifiedName());
-    } else {
-      return fieldsByName.get(column.getSimpleName()).get(0);
-    }
-  }
+  int getIndex(Column column);
 
   /**
    * Get a column by a given name.
@@ -178,224 +51,35 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
    * @param name The column name to be found.
    * @return The column matched to a given column name.
    */
-  public Column getColumn(String name) {
-
-    if (NestedPathUtil.isPath(name)) {
-
-      // TODO - to be refactored
-      if (fieldsByQualifiedName.containsKey(name)) {
-        Column flattenColumn = fields.get(fieldsByQualifiedName.get(name));
-        if (flattenColumn != null) {
-          return flattenColumn;
-        }
-      }
-
-      String [] paths = name.split(NestedPathUtil.PATH_DELIMITER);
-      Column column = getColumn(paths[0]);
-      if (column == null) {
-        return null;
-      }
-      Column actualColumn = NestedPathUtil.lookupPath(column, paths);
+  Column getColumn(String name);
 
-      Column columnPath = new Column(
-          column.getQualifiedName() + NestedPathUtil.makePath(paths, 1),
-          actualColumn.typeDesc);
+	int getColumnId(String name);
 
-      return columnPath;
-    } else {
-      String[] parts = name.split("\\.");
-      // Some of the string can includes database name and table name and column name.
-      // For example, it can be 'default.table1.id'.
-      // Therefore, spilt string array length can be 3.
-      if (parts.length >= 2) {
-        return getColumnByQName(name);
-      } else {
-        return getColumnByName(name);
-      }
-    }
-  }
-
-  /**
-   * Find a column by a qualified name (e.g., table1.col1).
-   *
-   * @param qualifiedName The qualified name
-   * @return The Column matched to a given qualified name
-   */
-  private Column getColumnByQName(String qualifiedName) {
-		Integer cid = fieldsByQualifiedName.get(qualifiedName);
-		return cid != null ? fields.get(cid) : null;
-	}
-
-  /**
-   * Find a column by a name (e.g., col1).
-   * The same name columns can be exist in a schema. For example, table1.col1 and table2.col1 coexist in a schema.
-   * In this case, it will throw {@link java.lang.RuntimeException}. But, it occurs rarely because all column names
-   * except for alias have a qualified form.
-   *
-   * @param columnName The column name without qualifier
-   * @return The Column matched to a given name.
-   */
-	private Column getColumnByName(String columnName) {
-    String normalized = columnName;
-	  List<Integer> list = fieldsByName.get(normalized);
-
-    if (list == null || list.size() == 0) {
-      return null;
-    }
-
-    if (list.size() == 1) {
-      return fields.get(list.get(0));
-    } else {
-      throw throwAmbiguousFieldException(list);
-    }
-	}
-
-  private RuntimeException throwAmbiguousFieldException(Collection<Integer> idList) {
-    StringBuilder sb = new StringBuilder();
-    boolean first = true;
-    for (Integer id : idList) {
-      if (first) {
-        first = false;
-      } else {
-        sb.append(", ");
-      }
-      sb.append(fields.get(id));
-    }
-    throw new RuntimeException("Ambiguous Column Name Access: " + sb.toString());
-  }
-	
-	public int getColumnId(String name) {
-    // if the same column exists, immediately return that column.
-    if (fieldsByQualifiedName.containsKey(name)) {
-      return fieldsByQualifiedName.get(name);
-    }
-
-    // The following is some workaround code.
-    List<Integer> list = fieldsByName.get(name);
-    if (list == null) {
-      return -1;
-    } else  if (list.size() == 1) {
-      return fieldsByName.get(name).get(0);
-    } else if (list.size() == 0) {
-      return -1;
-    } else { // if list.size > 2
-      throw throwAmbiguousFieldException(list);
-    }
-	}
-
-  public int getColumnIdByName(String colName) {
-    for (Column col : fields) {
-      if (col.getSimpleName().equals(colName)) {
-        String qualifiedName = col.getQualifiedName();
-        return fieldsByQualifiedName.get(qualifiedName);
-      }
-    }
-    return -1;
-  }
+  int getColumnIdByName(String colName);
 
   /**
    * Get root columns, meaning all columns except for nested fields.
    *
    * @return A list of root columns
    */
-	public List<Column> getRootColumns() {
-		return ImmutableList.copyOf(fields);
-	}
+	List<Column> getRootColumns();
 
   /**
    * Get all columns, including all nested fields
    *
    * @return A list of all columns
    */
-  public List<Column> getAllColumns() {
-    final List<Column> columnList = new ArrayList<>();
-
-    SchemaUtil.visitSchema(this, new ColumnVisitor() {
-      @Override
-      public void visit(int depth, List<String> path, Column column) {
-        if (path.size() > 0) {
-          String parentPath = StringUtils.join(path, NestedPathUtil.PATH_DELIMITER);
-          String currentPath = parentPath + NestedPathUtil.PATH_DELIMITER + column.getSimpleName();
-          columnList.add(new Column(currentPath, column.getTypeDesc()));
-        } else {
-          columnList.add(column);
-        }
-      }
-    });
-
-    return columnList;
-  }
-
-  public boolean contains(String name) {
-    // TODO - It's a hack
-    if (NestedPathUtil.isPath(name)) {
-      return (getColumn(name) != null);
-    }
-
-    if (fieldsByQualifiedName.containsKey(name)) {
-      return true;
-    }
-    if (fieldsByName.containsKey(name)) {
-      if (fieldsByName.get(name).size() > 1) {
-        throw new RuntimeException("Ambiguous Column name");
-      }
-      return true;
-    }
+  List<Column> getAllColumns();
 
-    return false;
-  }
+  boolean contains(String name);
 
-  public boolean contains(Column column) {
-    // TODO - It's a hack
-    if (NestedPathUtil.isPath(column.getQualifiedName())) {
-      return (getColumn(column.getQualifiedName()) != null);
-    }
-
-    if (column.hasQualifier()) {
-      return fieldsByQualifiedName.containsKey(column.getQualifiedName());
-    } else {
-      if (fieldsByName.containsKey(column.getSimpleName())) {
-        int num = fieldsByName.get(column.getSimpleName()).size();
-        if (num == 0) {
-          throw new IllegalStateException("No such column name: " + column.getSimpleName());
-        }
-        if (num > 1) {
-          throw new RuntimeException("Ambiguous column name: " + column.getSimpleName());
-        }
-        return true;
-      }
-      return false;
-    }
-  }
+  boolean contains(Column column);
 	
-	public boolean containsByQualifiedName(String qualifiedName) {
-		return fieldsByQualifiedName.containsKey(qualifiedName);
-	}
-
-  public boolean containsByName(String colName) {
-    return fieldsByName.containsKey(colName);
-  }
+	boolean containsByQualifiedName(String qualifiedName);
 
-  public boolean containsAll(Collection<Column> columns) {
-    boolean containFlag = true;
+  boolean containsByName(String colName);
 
-    for (Column c :columns) {
-      if (NestedPathUtil.isPath(c.getSimpleName())) {
-        if (contains(c.getQualifiedName())) {
-          containFlag &= true;
-        } else {
-          String[] paths = c.getQualifiedName().split("/");
-          boolean existRootPath = contains(paths[0]);
-          boolean existLeafPath = getColumn(c.getSimpleName()) != null;
-          containFlag &= existRootPath && existLeafPath;
-        }
-      } else {
-        containFlag &= fields.contains(c);
-      }
-    }
-
-    return containFlag;
-  }
+  boolean containsAll(Collection<Column> columns);
 
   /**
    * Return TRUE if any column in <code>columns</code> is included in this schema.
@@ -404,133 +88,34 @@ public class Schema implements ProtoObject<SchemaProto>, Cloneable, GsonObject {
    * @return true if any column in <code>columns</code> is included in this schema.
    *         Otherwise, false.
    */
-  public boolean containsAny(Collection<Column> columns) {
-    for (Column column : columns) {
-      if (contains(column)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public synchronized Schema addColumn(String name, TypeDesc typeDesc) {
-    String normalized = name;
-    if(fieldsByQualifiedName.containsKey(normalized)) {
-      throw new TajoRuntimeException(new DuplicateColumnException(normalized));
-    }
+  boolean containsAny(Collection<Column> columns);
 
-    Column newCol = new Column(normalized, typeDesc);
-    fields.add(newCol);
-    fieldsByQualifiedName.put(newCol.getQualifiedName(), fields.size() - 1);
-    List<Integer> inputList = new ArrayList<>();
-    inputList.add(fields.size() - 1);
-    fieldsByName.put(newCol.getSimpleName(), inputList);
+  Schema addColumn(String name, TypeDesc typeDesc);
 
-    return this;
-  }
+  Schema addColumn(String name, Type type);
 
-  public synchronized Schema addColumn(String name, Type type) {
-    return addColumn(name, CatalogUtil.newSimpleDataType(type));
-  }
+  Schema addColumn(String name, Type type, int length);
 
-  public synchronized Schema addColumn(String name, Type type, int length) {
-    return addColumn(name, CatalogUtil.newDataTypeWithLen(type, length));
-  }
-
-  public synchronized Schema addColumn(String name, DataType dataType) {
-		addColumn(name, new TypeDesc(dataType));
-
-		return this;
-	}
+  Schema addColumn(String name, DataType dataType);
 	
-	public synchronized void addColumn(Column column) {
-		addColumn(column.getQualifiedName(), column.typeDesc);
-	}
+	void addColumn(Column column);
 	
-	public synchronized void addColumns(Schema schema) {
-    for(Column column : schema.getRootColumns()) {
-      addColumn(column);
-    }
-  }
+	void addColumns(Schema schema);
 
-  @Override
-  public int hashCode() {
-    return Objects.hashCode(fields, fieldsByQualifiedName, fieldsByName);
-  }
 
   @Override
-	public boolean equals(Object o) {
-		if (o instanceof Schema) {
-		  Schema other = (Schema) o;
-		  return getProto().equals(other.getProto());
-		}
-		return false;
-	}
-	
-  @Override
-  public Object clone() throws CloneNotSupportedException {
-    Schema schema = (Schema) super.clone();
-    schema.init();
+	boolean equals(Object o);
 
-    for(Column column: this.fields) {
-      schema.addColumn(column);
-    }
-    return schema;
-  }
+  Object clone() throws CloneNotSupportedException;
 
 	@Override
-	public SchemaProto getProto() {
-    SchemaProto.Builder builder = SchemaProto.newBuilder();
-    SchemaProtoBuilder recursiveBuilder = new SchemaProtoBuilder(builder);
-    SchemaUtil.visitSchema(this, recursiveBuilder);
-    return builder.build();
-	}
-
-  private static class SchemaProtoBuilder implements ColumnVisitor {
-    private SchemaProto.Builder builder;
-    public SchemaProtoBuilder(SchemaProto.Builder builder) {
-      this.builder = builder;
-    }
-
-    @Override
-    public void visit(int depth, List<String> path, Column column) {
-
-      if (column.getDataType().getType() == Type.RECORD) {
-        DataType.Builder updatedType = DataType.newBuilder(column.getDataType());
-        updatedType.setNumNestedFields(column.typeDesc.nestedRecordSchema.size());
+	SchemaProto getProto();
 
-        ColumnProto.Builder updatedColumn = ColumnProto.newBuilder(column.getProto());
-        updatedColumn.setDataType(updatedType);
-
-        builder.addFields(updatedColumn.build());
-      } else {
-        builder.addFields(column.getProto());
-      }
-    }
-  }
-
-	public String toString() {
-	  StringBuilder sb = new StringBuilder();
-	  sb.append("{(").append(size()).append(") ");
-	  int i = 0;
-	  for(Column col : fields) {
-	    sb.append(col);
-	    if (i < fields.size() - 1) {
-	      sb.append(", ");
-	    }
-	    i++;
-	  }
-	  sb.append("}");
-	  
-	  return sb.toString();
-	}
+  @Override
+	String toString();
 
   @Override
-	public String toJson() {
-	  return CatalogGsonHelper.toJson(this, Schema.class);
-	}
+	String toJson();
 
-  public Column [] toArray() {
-    return this.fields.toArray(new Column[this.fields.size()]);
-  }
+  Column [] toArray();
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaFactory.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaFactory.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaFactory.java
new file mode 100644
index 0000000..fb6910b
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaFactory.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tajo.catalog;
+
+import org.apache.tajo.catalog.proto.CatalogProtos;
+import org.apache.tajo.exception.TajoInternalError;
+
+public class SchemaFactory {
+  public static Schema newV1() {
+    return new SchemaLegacy();
+  }
+
+  public static Schema newV1(CatalogProtos.SchemaProto proto) {
+    return new SchemaLegacy(proto);
+  }
+
+  public static Schema newV1(Schema schema) {
+    try {
+      return (Schema) schema.clone();
+    } catch (CloneNotSupportedException e) {
+      throw new TajoInternalError(e);
+    }
+  }
+
+  public static Schema newV1(Column [] columns) {
+    return new SchemaLegacy(columns);
+  }
+
+  public static Schema newV1(Iterable<Column> columns) {
+    return new SchemaLegacy(columns);
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaLegacy.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaLegacy.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaLegacy.java
new file mode 100644
index 0000000..f23d519
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaLegacy.java
@@ -0,0 +1,555 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tajo.catalog;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
+import com.google.gson.annotations.Expose;
+import org.apache.tajo.catalog.SchemaUtil.ColumnVisitor;
+import org.apache.tajo.catalog.json.CatalogGsonHelper;
+import org.apache.tajo.catalog.proto.CatalogProtos.ColumnProto;
+import org.apache.tajo.catalog.proto.CatalogProtos.SchemaProto;
+import org.apache.tajo.common.ProtoObject;
+import org.apache.tajo.common.TajoDataTypes.DataType;
+import org.apache.tajo.common.TajoDataTypes.Type;
+import org.apache.tajo.exception.DuplicateColumnException;
+import org.apache.tajo.exception.TajoRuntimeException;
+import org.apache.tajo.json.GsonObject;
+import org.apache.tajo.util.StringUtils;
+
+import java.util.*;
+
+public class SchemaLegacy implements Schema, ProtoObject<SchemaProto>, Cloneable, GsonObject {
+
+	@Expose protected List<Column> fields = null;
+	@Expose protected Map<String, Integer> fieldsByQualifiedName = null;
+  @Expose protected Map<String, List<Integer>> fieldsByName = null;
+
+	public SchemaLegacy() {
+    init();
+	}
+
+  /**
+   * This Schema constructor restores a serialized schema into in-memory Schema structure.
+   * A serialized schema is an ordered list in depth-first order over a nested schema.
+   * This constructor transforms the list into a tree-like structure.
+   *
+   * @param proto
+   */
+	public SchemaLegacy(SchemaProto proto) {
+    init();
+
+    List<Column> toBeAdded = new ArrayList<>();
+    for (int i = 0; i < proto.getFieldsCount(); i++) {
+      deserializeColumn(toBeAdded, proto.getFieldsList(), i);
+    }
+
+    for (Column c : toBeAdded) {
+      addColumn(c);
+    }
+  }
+
+  /**
+   * This method transforms a list of ColumnProtos into a schema tree.
+   * It assumes that <code>protos</code> contains a list of ColumnProtos in the depth-first order.
+   *
+   * @param tobeAdded
+   * @param protos
+   * @param serializedColumnIndex
+   */
+  private static void deserializeColumn(List<Column> tobeAdded, List<ColumnProto> protos, int serializedColumnIndex) {
+    ColumnProto columnProto = protos.get(serializedColumnIndex);
+    if (columnProto.getDataType().getType() == Type.RECORD) {
+
+      // Get the number of child fields
+      int childNum = columnProto.getDataType().getNumNestedFields();
+      // where is start index of nested fields?
+      int childStartIndex = tobeAdded.size() - childNum;
+      // Extract nested fields
+      List<Column> nestedColumns = new ArrayList<>(tobeAdded.subList(childStartIndex, childStartIndex + childNum));
+
+      // Remove nested fields from the the current level
+      for (int i = 0; i < childNum; i++) {
+        tobeAdded.remove(tobeAdded.size() - 1);
+      }
+
+      // Add the nested fields to the list as a single record column
+      tobeAdded.add(new Column(columnProto.getName(), new TypeDesc(new SchemaLegacy(nestedColumns))));
+    } else {
+      tobeAdded.add(new Column(protos.get(serializedColumnIndex)));
+    }
+  }
+
+	public SchemaLegacy(Schema schema) {
+	  new SchemaLegacy(schema.getRootColumns());
+	}
+
+  public SchemaLegacy(Column [] columns) {
+    init();
+
+    for(Column c : columns) {
+      addColumn(c);
+    }
+  }
+
+	public SchemaLegacy(Iterable<Column> columns) {
+    init();
+
+    for(Column c : columns) {
+      addColumn(c);
+    }
+  }
+
+  private void init() {
+    this.fields = new ArrayList<>();
+    this.fieldsByQualifiedName = new HashMap<>();
+    this.fieldsByName = new HashMap<>();
+  }
+
+  /**
+   * Set a qualifier to this schema.
+   * This changes the qualifier of all columns except for not-qualified columns.
+   *
+   * @param qualifier The qualifier
+   */
+  @Override
+  public void setQualifier(String qualifier) {
+    // only change root fields, and must keep each nested field simple name
+    List<Column> columns = getRootColumns();
+
+    fields.clear();
+    fieldsByQualifiedName.clear();
+    fieldsByName.clear();
+
+    Column newColumn;
+    for (Column c : columns) {
+      newColumn = new Column(qualifier + "." + c.getSimpleName(), c.typeDesc);
+      addColumn(newColumn);
+    }
+  }
+
+  @Override
+	public int size() {
+		return this.fields.size();
+	}
+
+  @Override
+  public Column getColumn(int id) {
+    return fields.get(id);
+  }
+
+  @Override
+  public Column getColumn(Column column) {
+    int idx = getIndex(column);
+    return idx >= 0 ? fields.get(idx) : null;
+  }
+
+  public int getIndex(Column column) {
+    if (!contains(column)) {
+      return -1;
+    }
+
+    if (column.hasQualifier()) {
+      return fieldsByQualifiedName.get(column.getQualifiedName());
+    } else {
+      return fieldsByName.get(column.getSimpleName()).get(0);
+    }
+  }
+
+  /**
+   * Get a column by a given name.
+   *
+   * @param name The column name to be found.
+   * @return The column matched to a given column name.
+   */
+  @Override
+  public Column getColumn(String name) {
+
+    if (NestedPathUtil.isPath(name)) {
+
+      // TODO - to be refactored
+      if (fieldsByQualifiedName.containsKey(name)) {
+        Column flattenColumn = fields.get(fieldsByQualifiedName.get(name));
+        if (flattenColumn != null) {
+          return flattenColumn;
+        }
+      }
+
+      String [] paths = name.split(NestedPathUtil.PATH_DELIMITER);
+      Column column = getColumn(paths[0]);
+      if (column == null) {
+        return null;
+      }
+      Column actualColumn = NestedPathUtil.lookupPath(column, paths);
+
+      Column columnPath = new Column(
+          column.getQualifiedName() + NestedPathUtil.makePath(paths, 1),
+          actualColumn.typeDesc);
+
+      return columnPath;
+    } else {
+      String[] parts = name.split("\\.");
+      // Some of the string can includes database name and table name and column name.
+      // For example, it can be 'default.table1.id'.
+      // Therefore, spilt string array length can be 3.
+      if (parts.length >= 2) {
+        return getColumnByQName(name);
+      } else {
+        return getColumnByName(name);
+      }
+    }
+  }
+
+  /**
+   * Find a column by a qualified name (e.g., table1.col1).
+   *
+   * @param qualifiedName The qualified name
+   * @return The Column matched to a given qualified name
+   */
+  private Column getColumnByQName(String qualifiedName) {
+		Integer cid = fieldsByQualifiedName.get(qualifiedName);
+		return cid != null ? fields.get(cid) : null;
+	}
+
+  /**
+   * Find a column by a name (e.g., col1).
+   * The same name columns can be exist in a schema. For example, table1.col1 and table2.col1 coexist in a schema.
+   * In this case, it will throw {@link RuntimeException}. But, it occurs rarely because all column names
+   * except for alias have a qualified form.
+   *
+   * @param columnName The column name without qualifier
+   * @return The Column matched to a given name.
+   */
+	private Column getColumnByName(String columnName) {
+    String normalized = columnName;
+	  List<Integer> list = fieldsByName.get(normalized);
+
+    if (list == null || list.size() == 0) {
+      return null;
+    }
+
+    if (list.size() == 1) {
+      return fields.get(list.get(0));
+    } else {
+      throw throwAmbiguousFieldException(list);
+    }
+	}
+
+  private RuntimeException throwAmbiguousFieldException(Collection<Integer> idList) {
+    StringBuilder sb = new StringBuilder();
+    boolean first = true;
+    for (Integer id : idList) {
+      if (first) {
+        first = false;
+      } else {
+        sb.append(", ");
+      }
+      sb.append(fields.get(id));
+    }
+    throw new RuntimeException("Ambiguous Column Name Access: " + sb.toString());
+  }
+
+  @Override
+	public int getColumnId(String name) {
+    // if the same column exists, immediately return that column.
+    if (fieldsByQualifiedName.containsKey(name)) {
+      return fieldsByQualifiedName.get(name);
+    }
+
+    // The following is some workaround code.
+    List<Integer> list = fieldsByName.get(name);
+    if (list == null) {
+      return -1;
+    } else  if (list.size() == 1) {
+      return fieldsByName.get(name).get(0);
+    } else if (list.size() == 0) {
+      return -1;
+    } else { // if list.size > 2
+      throw throwAmbiguousFieldException(list);
+    }
+	}
+
+  @Override
+  public int getColumnIdByName(String colName) {
+    for (Column col : fields) {
+      if (col.getSimpleName().equals(colName)) {
+        String qualifiedName = col.getQualifiedName();
+        return fieldsByQualifiedName.get(qualifiedName);
+      }
+    }
+    return -1;
+  }
+
+  /**
+   * Get root columns, meaning all columns except for nested fields.
+   *
+   * @return A list of root columns
+   */
+  @Override
+	public List<Column> getRootColumns() {
+		return ImmutableList.copyOf(fields);
+	}
+
+  /**
+   * Get all columns, including all nested fields
+   *
+   * @return A list of all columns
+   */
+  @Override
+  public List<Column> getAllColumns() {
+    final List<Column> columnList = new ArrayList<>();
+
+    SchemaUtil.visitSchema(this, new ColumnVisitor() {
+      @Override
+      public void visit(int depth, List<String> path, Column column) {
+        if (path.size() > 0) {
+          String parentPath = StringUtils.join(path, NestedPathUtil.PATH_DELIMITER);
+          String currentPath = parentPath + NestedPathUtil.PATH_DELIMITER + column.getSimpleName();
+          columnList.add(new Column(currentPath, column.getTypeDesc()));
+        } else {
+          columnList.add(column);
+        }
+      }
+    });
+
+    return columnList;
+  }
+
+  @Override
+  public boolean contains(String name) {
+    // TODO - It's a hack
+    if (NestedPathUtil.isPath(name)) {
+      return (getColumn(name) != null);
+    }
+
+    if (fieldsByQualifiedName.containsKey(name)) {
+      return true;
+    }
+    if (fieldsByName.containsKey(name)) {
+      if (fieldsByName.get(name).size() > 1) {
+        throw new RuntimeException("Ambiguous Column name");
+      }
+      return true;
+    }
+
+    return false;
+  }
+
+  @Override
+  public boolean contains(Column column) {
+    // TODO - It's a hack
+    if (NestedPathUtil.isPath(column.getQualifiedName())) {
+      return (getColumn(column.getQualifiedName()) != null);
+    }
+
+    if (column.hasQualifier()) {
+      return fieldsByQualifiedName.containsKey(column.getQualifiedName());
+    } else {
+      if (fieldsByName.containsKey(column.getSimpleName())) {
+        int num = fieldsByName.get(column.getSimpleName()).size();
+        if (num == 0) {
+          throw new IllegalStateException("No such column name: " + column.getSimpleName());
+        }
+        if (num > 1) {
+          throw new RuntimeException("Ambiguous column name: " + column.getSimpleName());
+        }
+        return true;
+      }
+      return false;
+    }
+  }
+
+  @Override
+	public boolean containsByQualifiedName(String qualifiedName) {
+		return fieldsByQualifiedName.containsKey(qualifiedName);
+	}
+
+  @Override
+  public boolean containsByName(String colName) {
+    return fieldsByName.containsKey(colName);
+  }
+
+  @Override
+  public boolean containsAll(Collection<Column> columns) {
+    boolean containFlag = true;
+
+    for (Column c :columns) {
+      if (NestedPathUtil.isPath(c.getSimpleName())) {
+        if (contains(c.getQualifiedName())) {
+          containFlag &= true;
+        } else {
+          String[] paths = c.getQualifiedName().split("/");
+          boolean existRootPath = contains(paths[0]);
+          boolean existLeafPath = getColumn(c.getSimpleName()) != null;
+          containFlag &= existRootPath && existLeafPath;
+        }
+      } else {
+        containFlag &= fields.contains(c);
+      }
+    }
+
+    return containFlag;
+  }
+
+  /**
+   * Return TRUE if any column in <code>columns</code> is included in this schema.
+   *
+   * @param columns Columns to be checked
+   * @return true if any column in <code>columns</code> is included in this schema.
+   *         Otherwise, false.
+   */
+  @Override
+  public boolean containsAny(Collection<Column> columns) {
+    for (Column column : columns) {
+      if (contains(column)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @Override
+  public synchronized SchemaLegacy addColumn(String name, TypeDesc typeDesc) {
+    String normalized = name;
+    if(fieldsByQualifiedName.containsKey(normalized)) {
+      throw new TajoRuntimeException(new DuplicateColumnException(normalized));
+    }
+
+    Column newCol = new Column(normalized, typeDesc);
+    fields.add(newCol);
+    fieldsByQualifiedName.put(newCol.getQualifiedName(), fields.size() - 1);
+    List<Integer> inputList = new ArrayList<>();
+    inputList.add(fields.size() - 1);
+    fieldsByName.put(newCol.getSimpleName(), inputList);
+
+    return this;
+  }
+
+  @Override
+  public synchronized SchemaLegacy addColumn(String name, Type type) {
+    return addColumn(name, CatalogUtil.newSimpleDataType(type));
+  }
+
+  @Override
+  public synchronized SchemaLegacy addColumn(String name, Type type, int length) {
+    return addColumn(name, CatalogUtil.newDataTypeWithLen(type, length));
+  }
+
+  @Override
+  public synchronized SchemaLegacy addColumn(String name, DataType dataType) {
+		addColumn(name, new TypeDesc(dataType));
+
+		return this;
+	}
+
+  @Override
+	public synchronized void addColumn(Column column) {
+		addColumn(column.getQualifiedName(), column.typeDesc);
+	}
+
+  @Override
+	public synchronized void addColumns(Schema schema) {
+    for(Column column : schema.getRootColumns()) {
+      addColumn(column);
+    }
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hashCode(fields, fieldsByQualifiedName, fieldsByName);
+  }
+
+  @Override
+	public boolean equals(Object o) {
+		if (o instanceof SchemaLegacy) {
+		  SchemaLegacy other = (SchemaLegacy) o;
+		  return getProto().equals(other.getProto());
+		}
+		return false;
+	}
+	
+  @Override
+  public Object clone() throws CloneNotSupportedException {
+    SchemaLegacy schema = (SchemaLegacy) super.clone();
+    schema.init();
+
+    for(Column column: this.fields) {
+      schema.addColumn(column);
+    }
+    return schema;
+  }
+
+	@Override
+	public SchemaProto getProto() {
+    SchemaProto.Builder builder = SchemaProto.newBuilder();
+    SchemaProtoBuilder recursiveBuilder = new SchemaProtoBuilder(builder);
+    SchemaUtil.visitSchema(this, recursiveBuilder);
+    return builder.build();
+	}
+
+  private static class SchemaProtoBuilder implements ColumnVisitor {
+    private SchemaProto.Builder builder;
+    public SchemaProtoBuilder(SchemaProto.Builder builder) {
+      this.builder = builder;
+    }
+
+    @Override
+    public void visit(int depth, List<String> path, Column column) {
+
+      if (column.getDataType().getType() == Type.RECORD) {
+        DataType.Builder updatedType = DataType.newBuilder(column.getDataType());
+        updatedType.setNumNestedFields(column.typeDesc.nestedRecordSchema.size());
+
+        ColumnProto.Builder updatedColumn = ColumnProto.newBuilder(column.getProto());
+        updatedColumn.setDataType(updatedType);
+
+        builder.addFields(updatedColumn.build());
+      } else {
+        builder.addFields(column.getProto());
+      }
+    }
+  }
+
+  @Override
+	public String toString() {
+	  StringBuilder sb = new StringBuilder();
+	  sb.append("{(").append(size()).append(") ");
+	  int i = 0;
+	  for(Column col : fields) {
+	    sb.append(col);
+	    if (i < fields.size() - 1) {
+	      sb.append(", ");
+	    }
+	    i++;
+	  }
+	  sb.append("}");
+	  
+	  return sb.toString();
+	}
+
+  @Override
+	public String toJson() {
+	  return CatalogGsonHelper.toJson(this, SchemaLegacy.class);
+	}
+
+  @Override
+  public Column [] toArray() {
+    return this.fields.toArray(new Column[this.fields.size()]);
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaUtil.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaUtil.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaUtil.java
index 0ffe584..0c62ae5 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaUtil.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaUtil.java
@@ -42,7 +42,7 @@ public class SchemaUtil {
   // The essential solution would be https://issues.apache.org/jira/browse/TAJO-895.
   static int tmpColumnSeq = 0;
   public static Schema merge(Schema left, Schema right) {
-    Schema merged = new Schema();
+    Schema merged = SchemaFactory.newV1();
     for(Column col : left.getRootColumns()) {
       if (!merged.containsByQualifiedName(col.getQualifiedName())) {
         merged.addColumn(col);
@@ -67,7 +67,7 @@ public class SchemaUtil {
    * Get common columns to be used as join keys of natural joins.
    */
   public static Schema getNaturalJoinColumns(Schema left, Schema right) {
-    Schema common = new Schema();
+    Schema common = SchemaFactory.newV1();
     for (Column outer : left.getRootColumns()) {
       if (!common.containsByName(outer.getSimpleName()) && right.containsByName(outer.getSimpleName())) {
         common.addColumn(new Column(outer.getSimpleName(), outer.getDataType()));
@@ -78,7 +78,7 @@ public class SchemaUtil {
   }
 
   public static Schema getQualifiedLogicalSchema(TableDesc tableDesc, String tableName) {
-    Schema logicalSchema = new Schema(tableDesc.getLogicalSchema());
+    Schema logicalSchema = SchemaFactory.newV1(tableDesc.getLogicalSchema());
     if (tableName != null) {
       logicalSchema.setQualifier(tableName);
     }
@@ -208,7 +208,7 @@ public class SchemaUtil {
    */
   public static int estimateRowByteSizeWithSchema(Schema schema) {
     int size = 0;
-    for (Column column : schema.fields) {
+    for (Column column : schema.getAllColumns()) {
       size += getColByteSize(column);
     }
     return size;

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDesc.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDesc.java
index 3cdc00b..392a83d 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TableDesc.java
@@ -70,7 +70,7 @@ public class TableDesc implements ProtoObject<TableDescProto>, GsonObject, Clone
 	}
 	
 	public TableDesc(TableDescProto proto) {
-	  this(proto.getTableName(), proto.hasSchema() ? new Schema(proto.getSchema()) : null,
+	  this(proto.getTableName(), proto.hasSchema() ? SchemaFactory.newV1(proto.getSchema()) : null,
         new TableMeta(proto.getMeta()), proto.hasPath() ? URI.create(proto.getPath()) : null, proto.getIsExternal());
     if(proto.hasStats()) {
       this.stats = new TableStats(proto.getStats());
@@ -122,7 +122,7 @@ public class TableDesc implements ProtoObject<TableDescProto>, GsonObject, Clone
 
   public Schema getLogicalSchema() {
     if (hasPartition()) {
-      Schema logicalSchema = new Schema(schema);
+      Schema logicalSchema = SchemaFactory.newV1(schema);
       logicalSchema.addColumns(getPartitionMethod().getExpressionSchema());
       logicalSchema.setQualifier(tableName);
       return logicalSchema;

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/CatalogGsonHelper.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/CatalogGsonHelper.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/CatalogGsonHelper.java
index ec439f0..c145ecd 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/CatalogGsonHelper.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/CatalogGsonHelper.java
@@ -21,10 +21,11 @@ package org.apache.tajo.catalog.json;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableMeta;
-import org.apache.tajo.function.Function;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
+import org.apache.tajo.function.Function;
 import org.apache.tajo.json.*;
 
 import java.lang.reflect.Type;
@@ -38,14 +39,15 @@ public class CatalogGsonHelper {
   private CatalogGsonHelper() {
   }
 
-  private static Map<Type, GsonSerDerAdapter> registerAdapters() {
-    Map<Type, GsonSerDerAdapter> adapters = new HashMap<>();
+  private static Map<Type, GsonSerDerAdapter<?>> registerAdapters() {
+    Map<Type, GsonSerDerAdapter<?>> adapters = new HashMap<>();
     adapters.put(Class.class, new ClassNameSerializer());
     adapters.put(Path.class, new PathSerializer());
     adapters.put(TableMeta.class, new TableMetaAdapter());
     adapters.put(Function.class, new FunctionAdapter());
     adapters.put(Datum.class, new DatumAdapter());
     adapters.put(DataType.class, new DataTypeAdapter());
+    adapters.put(Schema.class, new SchemaAdapter());
     return adapters;
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/SchemaAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/SchemaAdapter.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/SchemaAdapter.java
new file mode 100644
index 0000000..f7c2392
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/json/SchemaAdapter.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tajo.catalog.json;
+
+import com.google.gson.*;
+import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaLegacy;
+import org.apache.tajo.exception.TajoInternalError;
+import org.apache.tajo.exception.TajoRuntimeException;
+import org.apache.tajo.exception.UnsupportedException;
+import org.apache.tajo.function.Function;
+import org.apache.tajo.json.CommonGsonHelper;
+import org.apache.tajo.json.GsonSerDerAdapter;
+
+import java.lang.reflect.Type;
+
+public class SchemaAdapter implements GsonSerDerAdapter<Schema> {
+
+  @Override
+  public JsonElement serialize(Schema src, Type typeOfSrc,
+      JsonSerializationContext context) {
+    JsonObject jsonObj = new JsonObject();
+    jsonObj.addProperty("version", src instanceof SchemaLegacy ? "1" : "2");
+    JsonElement jsonElem = context.serialize(src);
+    jsonObj.add("body", jsonElem);
+    return jsonObj;
+  }
+
+  @Override
+  public Schema deserialize(JsonElement json, Type typeOfT,
+      JsonDeserializationContext context) throws JsonParseException {
+    JsonObject jsonObject = json.getAsJsonObject();
+    int version = CommonGsonHelper.getOrDie(jsonObject, "version").getAsJsonPrimitive().getAsInt();
+    
+    if (version == 1) {
+      return context.deserialize(CommonGsonHelper.getOrDie(jsonObject, "body"), SchemaLegacy.class);
+    } else {
+      throw new TajoInternalError("Schema version 2 is not supported yet");
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionMethodDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionMethodDesc.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionMethodDesc.java
index 721a7a0..d3f10ad 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionMethodDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/partition/PartitionMethodDesc.java
@@ -23,6 +23,7 @@ import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.json.CatalogGsonHelper;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.common.ProtoObject;
@@ -59,7 +60,7 @@ public class PartitionMethodDesc implements ProtoObject<CatalogProtos.PartitionM
     this(proto.getTableIdentifier().getDatabaseName(),
         proto.getTableIdentifier().getTableName(),
         proto.getPartitionType(), proto.getExpression(),
-        new Schema(proto.getExpressionSchema()));
+        SchemaFactory.newV1(proto.getExpressionSchema()));
   }
 
   public String getTableName() {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestIndexDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestIndexDesc.java b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestIndexDesc.java
index 7561dfd..0b7516e 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestIndexDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestIndexDesc.java
@@ -40,7 +40,7 @@ public class TestIndexDesc {
 
   @BeforeClass
   public static void setUp() throws Exception {
-    relationSchema = new Schema(new Column[]{new Column("id", Type.INT4),
+    relationSchema = SchemaFactory.newV1(new Column[]{new Column("id", Type.INT4),
         new Column("score", Type.FLOAT8), new Column("name", Type.TEXT)});
     SortSpec[] colSpecs1 = new SortSpec[1];
     colSpecs1[0] = new SortSpec(new Column("id", Type.INT4), true, true);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java
index c4092f0..6235945 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestSchema.java
@@ -40,10 +40,10 @@ public class TestSchema {
 
   static {
     // simple nested schema
-    nestedSchema1 = new Schema();
+    nestedSchema1 = SchemaFactory.newV1();
     nestedSchema1.addColumn("s1", Type.INT8);
 
-    Schema nestedRecordSchema = new Schema();
+    Schema nestedRecordSchema = SchemaFactory.newV1();
     nestedRecordSchema.addColumn("s2", Type.FLOAT4);
     nestedRecordSchema.addColumn("s3", Type.TEXT);
 
@@ -63,10 +63,10 @@ public class TestSchema {
     //  |- s8
     //     |- s6
     //     |- s7
-    nestedSchema2 = new Schema();
+    nestedSchema2 = SchemaFactory.newV1();
     nestedSchema2.addColumn("s1", Type.INT8);
 
-    Schema nestedRecordSchema1 = new Schema();
+    Schema nestedRecordSchema1 = SchemaFactory.newV1();
     nestedRecordSchema1.addColumn("s2", Type.FLOAT4);
     nestedRecordSchema1.addColumn("s3", Type.TEXT);
 
@@ -75,7 +75,7 @@ public class TestSchema {
 
     nestedSchema2.addColumn("s5", Type.FLOAT8);
 
-    Schema nestedRecordSchema2 = new Schema();
+    Schema nestedRecordSchema2 = SchemaFactory.newV1();
     nestedRecordSchema2.addColumn("s6", Type.FLOAT4);
     nestedRecordSchema2.addColumn("s7", Type.TEXT);
 
@@ -95,18 +95,18 @@ public class TestSchema {
     //      |- s8
     //  |- s9
 
-    nestedSchema3 = new Schema();
+    nestedSchema3 = SchemaFactory.newV1();
     nestedSchema3.addColumn("s1", Type.INT8);
 
     nestedSchema3.addColumn("s2", Type.INT8);
 
-    Schema s5 = new Schema();
+    Schema s5 = SchemaFactory.newV1();
     s5.addColumn("s6", Type.INT8);
 
-    Schema s7 = new Schema();
+    Schema s7 = SchemaFactory.newV1();
     s7.addColumn("s5", new TypeDesc(s5));
 
-    Schema s3 = new Schema();
+    Schema s3 = SchemaFactory.newV1();
     s3.addColumn("s4", Type.INT8);
     s3.addColumn("s7", new TypeDesc(s7));
     s3.addColumn("s8", Type.INT8);
@@ -117,7 +117,7 @@ public class TestSchema {
 
 	@Before
 	public void setUp() throws Exception {
-		schema = new Schema();
+		schema = SchemaFactory.newV1();
 		col1 = new Column("name", Type.TEXT);
 		schema.addColumn(col1);
 		col2 = new Column("age", Type.INT4);
@@ -128,14 +128,14 @@ public class TestSchema {
 
 	@Test
 	public final void testSchemaSchema() {
-		Schema schema2 = new Schema(schema);
+		Schema schema2 = SchemaFactory.newV1(schema);
 		
 		assertEquals(schema, schema2);
 	}
 
 	@Test
 	public final void testSchemaSchemaProto() {
-		Schema schema2 = new Schema(schema.getProto());
+		Schema schema2 = SchemaFactory.newV1(schema.getProto());
 		
 		assertEquals(schema, schema2);
 	}
@@ -149,7 +149,7 @@ public class TestSchema {
 
 	@Test
 	public final void testAddField() {
-		Schema schema = new Schema();
+		Schema schema = SchemaFactory.newV1();
 		assertFalse(schema.containsByQualifiedName("studentId"));
 		schema.addColumn("studentId", Type.INT4);
 		assertTrue(schema.containsByQualifiedName("studentId"));
@@ -157,7 +157,7 @@ public class TestSchema {
 
 	@Test
 	public final void testEqualsObject() {
-		Schema schema2 = new Schema();
+		Schema schema2 = SchemaFactory.newV1();
 		schema2.addColumn("name", Type.TEXT);
 		schema2.addColumn("age", Type.INT4);
 		schema2.addColumn("addr", Type.TEXT);
@@ -176,11 +176,11 @@ public class TestSchema {
 	
 	@Test
 	public final void testClone() throws CloneNotSupportedException {
-	  Schema schema = new Schema();
+	  Schema schema = SchemaFactory.newV1();
 	  schema.addColumn("abc", Type.FLOAT8);
 	  schema.addColumn("bbc", Type.FLOAT8);
 	  
-	  Schema schema2 = new Schema(schema.getProto());
+	  Schema schema2 = SchemaFactory.newV1(schema.getProto());
 	  assertEquals(schema.getProto(), schema2.getProto());
 	  assertEquals(schema.getColumn(0), schema2.getColumn(0));
 	  assertEquals(schema.size(), schema2.size());
@@ -193,7 +193,7 @@ public class TestSchema {
 	
 	@Test(expected = TajoRuntimeException.class)
 	public final void testAddExistColumn() {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("abc", Type.FLOAT8);
     schema.addColumn("bbc", Type.FLOAT8);
     schema.addColumn("abc", Type.INT4);
@@ -201,31 +201,31 @@ public class TestSchema {
 
 	@Test
 	public final void testJson() {
-		Schema schema2 = new Schema(schema.getProto());
+		Schema schema2 = SchemaFactory.newV1(schema.getProto());
 		String json = schema2.toJson();
-		Schema fromJson = CatalogGsonHelper.fromJson(json, Schema.class);
+		Schema fromJson = CatalogGsonHelper.fromJson(json, SchemaLegacy.class);
 		assertEquals(schema2, fromJson);
     assertEquals(schema2.getProto(), fromJson.getProto());
 	}
 
   @Test
   public final void testProto() {
-    Schema schema2 = new Schema(schema.getProto());
+    Schema schema2 = SchemaFactory.newV1(schema.getProto());
     SchemaProto proto = schema2.getProto();
-    Schema fromJson = new Schema(proto);
-    assertEquals(schema2, fromJson);
+    Schema fromProto = SchemaFactory.newV1(proto);
+    assertEquals(schema2, fromProto);
   }
 
   @Test
   public final void testSetQualifier() {
-    Schema schema2 = new Schema(schema.getProto());
+    Schema schema2 = SchemaFactory.newV1(schema.getProto());
     schema2.setQualifier("test1");
     Column column = schema2.getColumn(1);
     assertEquals(1, schema2.getColumnIdByName("age"));
     assertEquals(column, schema2.getColumn("age"));
     assertEquals(column, schema2.getColumn("test1.age"));
 
-    Schema schema3 = new Schema();
+    Schema schema3 = SchemaFactory.newV1();
     schema3.addColumn("tb1.col1", Type.INT4);
     schema3.addColumn("col2", Type.INT4);
     assertEquals("tb1", schema3.getColumn(0).getQualifier());
@@ -267,17 +267,17 @@ public class TestSchema {
 
   @Test
   public void testNestedRecord4() {
-    Schema root = new Schema();
+    Schema root = SchemaFactory.newV1();
 
-    Schema nf2DotNf1 = new Schema();
+    Schema nf2DotNf1 = SchemaFactory.newV1();
     nf2DotNf1.addColumn("f1", Type.INT8);
     nf2DotNf1.addColumn("f2", Type.INT8);
 
-    Schema nf2DotNf2 = new Schema();
+    Schema nf2DotNf2 = SchemaFactory.newV1();
     nf2DotNf2.addColumn("f1", Type.INT8);
     nf2DotNf2.addColumn("f2", Type.INT8);
 
-    Schema nf2 = new Schema();
+    Schema nf2 = SchemaFactory.newV1();
     nf2.addColumn("f1", Type.INT8);
     nf2.addColumn("nf1", new TypeDesc(nf2DotNf1));
     nf2.addColumn("nf2", new TypeDesc(nf2DotNf2));
@@ -295,7 +295,7 @@ public class TestSchema {
     assertEquals(s1, s1);
 
     SchemaProto proto = s1.getProto();
-    assertEquals("Proto (de)serialized schema is different from the original: ", s1, new Schema(proto));
+    assertEquals("Proto (de)serialized schema is different from the original: ", s1, SchemaFactory.newV1(proto));
 
     Schema cloned = null;
     try {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 b3d343d..f334738 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
@@ -41,7 +41,7 @@ public class TestTableDesc {
 	
 	@Before
 	public void setup() throws IOException {
-	  schema = new Schema();
+	  schema = SchemaFactory.newV1();
     schema.addColumn("name", Type.BLOB);
     schema.addColumn("addr", Type.TEXT);
     info = CatalogUtil.newTableMeta("TEXT");
@@ -67,7 +67,7 @@ public class TestTableDesc {
 
   @Test
   public void test() throws CloneNotSupportedException, IOException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("name", Type.BLOB);
     schema.addColumn("addr", Type.TEXT);
     TableMeta info = CatalogUtil.newTableMeta("TEXT");

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 d85fc48..2e4c6a9 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
@@ -38,7 +38,7 @@ public class TestTableMeta {
   
   @Test
   public void testTableMetaTableProto() {    
-    Schema schema1 = new Schema();
+    Schema schema1 = SchemaFactory.newV1();
     schema1.addColumn("name", Type.BLOB);
     schema1.addColumn("addr", Type.TEXT);
     TableMeta meta1 = CatalogUtil.newTableMeta("TEXT");
@@ -49,7 +49,7 @@ public class TestTableMeta {
   
   @Test
   public final void testClone() throws CloneNotSupportedException {
-    Schema schema1 = new Schema();
+    Schema schema1 = SchemaFactory.newV1();
     schema1.addColumn("name", Type.BLOB);
     schema1.addColumn("addr", Type.TEXT);
     TableMeta meta1 = CatalogUtil.newTableMeta("TEXT");
@@ -61,7 +61,7 @@ public class TestTableMeta {
   
   @Test
   public void testSchema() throws CloneNotSupportedException {
-    Schema schema1 = new Schema();
+    Schema schema1 = SchemaFactory.newV1();
     schema1.addColumn("name", Type.BLOB);
     schema1.addColumn("addr", Type.TEXT);
     TableMeta meta1 = CatalogUtil.newTableMeta("TEXT");
@@ -78,7 +78,7 @@ public class TestTableMeta {
   
   @Test
   public void testEqualsObject() {   
-    Schema schema2 = new Schema();
+    Schema schema2 = SchemaFactory.newV1();
     schema2.addColumn("name", Type.BLOB);
     schema2.addColumn("addr", Type.TEXT);
     TableMeta meta2 = CatalogUtil.newTableMeta("TEXT");

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-drivers/tajo-hive/src/main/java/org/apache/tajo/catalog/store/HiveCatalogStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-drivers/tajo-hive/src/main/java/org/apache/tajo/catalog/store/HiveCatalogStore.java b/tajo-catalog/tajo-catalog-drivers/tajo-hive/src/main/java/org/apache/tajo/catalog/store/HiveCatalogStore.java
index 95cbf18..954817c 100644
--- a/tajo-catalog/tajo-catalog-drivers/tajo-hive/src/main/java/org/apache/tajo/catalog/store/HiveCatalogStore.java
+++ b/tajo-catalog/tajo-catalog-drivers/tajo-hive/src/main/java/org/apache/tajo/catalog/store/HiveCatalogStore.java
@@ -148,7 +148,7 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
       path = table.getPath();
 
       // convert HiveCatalogStore field schema into tajo field schema.
-      schema = new org.apache.tajo.catalog.Schema();
+      schema = SchemaFactory.newV1();
 
       List<FieldSchema> fieldSchemaList = table.getCols();
       boolean isPartitionKey;
@@ -238,7 +238,7 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
       List<FieldSchema> partitionKeys = table.getPartitionKeys();
 
       if (null != partitionKeys) {
-        org.apache.tajo.catalog.Schema expressionSchema = new org.apache.tajo.catalog.Schema();
+        org.apache.tajo.catalog.Schema expressionSchema = SchemaFactory.newV1();
         StringBuilder sb = new StringBuilder();
         if (partitionKeys.size() > 0) {
           for (int i = 0; i < partitionKeys.size(); i++) {
@@ -814,7 +814,7 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
       List<FieldSchema> partitionKeys = table.getPartitionKeys();
 
       if (partitionKeys != null && partitionKeys.size() > 0) {
-        org.apache.tajo.catalog.Schema expressionSchema = new org.apache.tajo.catalog.Schema();
+        org.apache.tajo.catalog.Schema expressionSchema = SchemaFactory.newV1();
         StringBuilder sb = new StringBuilder();
         if (partitionKeys.size() > 0) {
           for (int i = 0; i < partitionKeys.size(); i++) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-drivers/tajo-hive/src/test/java/org/apache/tajo/catalog/store/TestHiveCatalogStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-drivers/tajo-hive/src/test/java/org/apache/tajo/catalog/store/TestHiveCatalogStore.java b/tajo-catalog/tajo-catalog-drivers/tajo-hive/src/test/java/org/apache/tajo/catalog/store/TestHiveCatalogStore.java
index 46935fc..e8d60cf 100644
--- a/tajo-catalog/tajo-catalog-drivers/tajo-hive/src/test/java/org/apache/tajo/catalog/store/TestHiveCatalogStore.java
+++ b/tajo-catalog/tajo-catalog-drivers/tajo-hive/src/test/java/org/apache/tajo/catalog/store/TestHiveCatalogStore.java
@@ -95,7 +95,7 @@ public class TestHiveCatalogStore {
   public void testTableUsingTextFile() throws Exception {
     TableMeta meta = new TableMeta(BuiltinStorages.TEXT, new KeyValueSet());
 
-    org.apache.tajo.catalog.Schema schema = new org.apache.tajo.catalog.Schema();
+    org.apache.tajo.catalog.Schema schema = SchemaFactory.newV1();
     schema.addColumn("c_custkey", TajoDataTypes.Type.INT4);
     schema.addColumn("c_name", TajoDataTypes.Type.TEXT);
     schema.addColumn("c_address", TajoDataTypes.Type.TEXT);
@@ -135,7 +135,7 @@ public class TestHiveCatalogStore {
     options.set(StorageConstants.RCFILE_SERDE, StorageConstants.DEFAULT_BINARY_SERDE);
     TableMeta meta = new TableMeta(BuiltinStorages.RCFILE, options);
 
-    org.apache.tajo.catalog.Schema schema = new org.apache.tajo.catalog.Schema();
+    org.apache.tajo.catalog.Schema schema = SchemaFactory.newV1();
     schema.addColumn("r_regionkey", TajoDataTypes.Type.INT4);
     schema.addColumn("r_name", TajoDataTypes.Type.TEXT);
     schema.addColumn("r_comment", TajoDataTypes.Type.TEXT);
@@ -169,7 +169,7 @@ public class TestHiveCatalogStore {
     options.set(StorageConstants.RCFILE_SERDE, StorageConstants.DEFAULT_TEXT_SERDE);
     TableMeta meta = new TableMeta(BuiltinStorages.RCFILE, options);
 
-    org.apache.tajo.catalog.Schema schema = new org.apache.tajo.catalog.Schema();
+    org.apache.tajo.catalog.Schema schema = SchemaFactory.newV1();
     schema.addColumn("r_regionkey", TajoDataTypes.Type.INT4);
     schema.addColumn("r_name", TajoDataTypes.Type.TEXT);
     schema.addColumn("r_comment", TajoDataTypes.Type.TEXT);
@@ -203,7 +203,7 @@ public class TestHiveCatalogStore {
     options.set(StorageConstants.TEXT_NULL, StringEscapeUtils.escapeJava("\u0003"));
     TableMeta meta = new TableMeta(BuiltinStorages.TEXT, options);
 
-    org.apache.tajo.catalog.Schema schema = new org.apache.tajo.catalog.Schema();
+    org.apache.tajo.catalog.Schema schema = SchemaFactory.newV1();
     schema.addColumn("s_suppkey", TajoDataTypes.Type.INT4);
     schema.addColumn("s_name", TajoDataTypes.Type.TEXT);
     schema.addColumn("s_address", TajoDataTypes.Type.TEXT);
@@ -252,7 +252,7 @@ public class TestHiveCatalogStore {
   public void testAddTableByPartition() throws Exception {
     TableMeta meta = new TableMeta("TEXT", new KeyValueSet());
 
-    org.apache.tajo.catalog.Schema schema = new org.apache.tajo.catalog.Schema();
+    org.apache.tajo.catalog.Schema schema = SchemaFactory.newV1();
     schema.addColumn("n_name", TajoDataTypes.Type.TEXT);
     schema.addColumn("n_regionkey", TajoDataTypes.Type.INT4);
     schema.addColumn("n_comment", TajoDataTypes.Type.TEXT);
@@ -261,7 +261,7 @@ public class TestHiveCatalogStore {
     TableDesc table = new TableDesc(CatalogUtil.buildFQName(DB_NAME, NATION), schema, meta,
         new Path(warehousePath, new Path(DB_NAME, NATION)).toUri());
 
-    org.apache.tajo.catalog.Schema expressionSchema = new org.apache.tajo.catalog.Schema();
+    org.apache.tajo.catalog.Schema expressionSchema = SchemaFactory.newV1();
     expressionSchema.addColumn("n_nationkey", TajoDataTypes.Type.INT4);
     expressionSchema.addColumn("n_date", TajoDataTypes.Type.TEXT);
 
@@ -500,7 +500,7 @@ public class TestHiveCatalogStore {
   @Test
   public void testGetAllTableNames() throws Exception{
     TableMeta meta = new TableMeta(BuiltinStorages.TEXT, new KeyValueSet());
-    org.apache.tajo.catalog.Schema schema = new org.apache.tajo.catalog.Schema();
+    org.apache.tajo.catalog.Schema schema = SchemaFactory.newV1();
     schema.addColumn("n_name", TajoDataTypes.Type.TEXT);
     schema.addColumn("n_regionkey", TajoDataTypes.Type.INT4);
     schema.addColumn("n_comment", TajoDataTypes.Type.TEXT);
@@ -528,7 +528,7 @@ public class TestHiveCatalogStore {
   @Test
   public void testDeleteTable() throws Exception {
     TableMeta meta = new TableMeta(BuiltinStorages.TEXT, new KeyValueSet());
-    org.apache.tajo.catalog.Schema schema = new org.apache.tajo.catalog.Schema();
+    org.apache.tajo.catalog.Schema schema = SchemaFactory.newV1();
     schema.addColumn("n_name", TajoDataTypes.Type.TEXT);
     schema.addColumn("n_regionkey", TajoDataTypes.Type.INT4);
     schema.addColumn("n_comment", TajoDataTypes.Type.TEXT);
@@ -553,7 +553,7 @@ public class TestHiveCatalogStore {
     options.set(StorageConstants.SEQUENCEFILE_SERDE, StorageConstants.DEFAULT_BINARY_SERDE);
     TableMeta meta = new TableMeta(BuiltinStorages.SEQUENCE_FILE, options);
 
-    org.apache.tajo.catalog.Schema schema = new org.apache.tajo.catalog.Schema();
+    org.apache.tajo.catalog.Schema schema = SchemaFactory.newV1();
     schema.addColumn("r_regionkey", TajoDataTypes.Type.INT4);
     schema.addColumn("r_name", TajoDataTypes.Type.TEXT);
     schema.addColumn("r_comment", TajoDataTypes.Type.TEXT);
@@ -587,7 +587,7 @@ public class TestHiveCatalogStore {
     options.set(StorageConstants.SEQUENCEFILE_SERDE, StorageConstants.DEFAULT_TEXT_SERDE);
     TableMeta meta = new TableMeta(BuiltinStorages.SEQUENCE_FILE, options);
 
-    org.apache.tajo.catalog.Schema schema = new org.apache.tajo.catalog.Schema();
+    org.apache.tajo.catalog.Schema schema = SchemaFactory.newV1();
     schema.addColumn("r_regionkey", TajoDataTypes.Type.INT4);
     schema.addColumn("r_name", TajoDataTypes.Type.TEXT);
     schema.addColumn("r_comment", TajoDataTypes.Type.TEXT);
@@ -619,7 +619,7 @@ public class TestHiveCatalogStore {
   public void testTableUsingParquet() throws Exception {
     TableMeta meta = new TableMeta("PARQUET", new KeyValueSet());
 
-    org.apache.tajo.catalog.Schema schema = new org.apache.tajo.catalog.Schema();
+    org.apache.tajo.catalog.Schema schema = SchemaFactory.newV1();
     schema.addColumn("c_custkey", TajoDataTypes.Type.INT4);
     schema.addColumn("c_name", TajoDataTypes.Type.TEXT);
     schema.addColumn("c_address", TajoDataTypes.Type.TEXT);
@@ -656,7 +656,7 @@ public class TestHiveCatalogStore {
 
     TableMeta meta = new TableMeta(BuiltinStorages.TEXT, new KeyValueSet());
 
-    org.apache.tajo.catalog.Schema schema = new org.apache.tajo.catalog.Schema();
+    org.apache.tajo.catalog.Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TajoDataTypes.Type.INT4);
     schema.addColumn("col2", TajoDataTypes.Type.INT1);
     schema.addColumn("col3", TajoDataTypes.Type.INT2);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/AbstractDBStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/AbstractDBStore.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/AbstractDBStore.java
index 99ffcb5..1c93d08 100644
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/AbstractDBStore.java
+++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/AbstractDBStore.java
@@ -2717,7 +2717,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
       // Since the column names in the unified name are always sorted
       // in order of occurrence position in the relation schema,
       // they can be uniquely identified.
-      String unifiedName = CatalogUtil.getUnifiedSimpleColumnName(new Schema(tableDescProto.getSchema()), columnNames);
+      String unifiedName = CatalogUtil.getUnifiedSimpleColumnName(SchemaFactory.newV1(tableDescProto.getSchema()), columnNames);
       pstmt.setInt(1, databaseId);
       pstmt.setInt(2, tableId);
       pstmt.setString(3, unifiedName);
@@ -2784,12 +2784,12 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
     try (PreparedStatement pstmt = getConnection().prepareStatement(sql)) {
       int databaseId = getDatabaseId(databaseName);
       int tableId = getTableId(databaseId, databaseName, tableName);
-      Schema relationSchema = new Schema(getTable(databaseName, tableName).getSchema());
+      Schema relationSchema = SchemaFactory.newV1(getTable(databaseName, tableName).getSchema());
 
       // Since the column names in the unified name are always sorted
       // in order of occurrence position in the relation schema,
       // they can be uniquely identified.
-      String unifiedName = CatalogUtil.getUnifiedSimpleColumnName(new Schema(relationSchema), columnNames);
+      String unifiedName = CatalogUtil.getUnifiedSimpleColumnName(SchemaFactory.newV1(relationSchema), columnNames);
       pstmt.setInt(1, databaseId);
       pstmt.setInt(2, tableId);
       pstmt.setString(3, unifiedName);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/CatalogTestingUtil.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/CatalogTestingUtil.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/CatalogTestingUtil.java
index 3a1a0cd..51461d1 100644
--- a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/CatalogTestingUtil.java
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/CatalogTestingUtil.java
@@ -197,7 +197,7 @@ public class CatalogTestingUtil {
   }
 
   public static TableDesc buildTableDesc(String databaseName, String tableName, String testDir) throws IOException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn(CatalogUtil.buildFQName(tableName, "Column"), Type.BLOB);
     schema.addColumn(CatalogUtil.buildFQName(tableName, "column"), Type.INT4);
     schema.addColumn(CatalogUtil.buildFQName(tableName, "cOlumn"), Type.INT8);
@@ -213,7 +213,7 @@ public class CatalogTestingUtil {
   }
 
   public static TableDesc buildPartitionTableDesc(String databaseName, String tableName, String testDir) throws Exception {
-    Schema partSchema = new Schema();
+    Schema partSchema = SchemaFactory.newV1();
     partSchema.addColumn(CatalogUtil.buildFQName(tableName, "DaTe"), Type.TEXT);
     partSchema.addColumn(CatalogUtil.buildFQName(tableName, "dAtE"), Type.TEXT);
     PartitionMethodDesc partitionMethodDesc =


[2/5] tajo git commit: TAJO-2099: Implement an Adapter for legacy Schema.

Posted by hy...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestTablesResource.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestTablesResource.java b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestTablesResource.java
index 9d42102..381c044 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestTablesResource.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/ws/rs/resources/TestTablesResource.java
@@ -23,6 +23,7 @@ import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.conf.TajoConf.ConfVars;
 import org.apache.tajo.error.Errors.ResultCode;
+import org.apache.tajo.plan.serder.PlanGsonHelper;
 import org.apache.tajo.ws.rs.netty.gson.GsonFeature;
 import org.apache.tajo.ws.rs.requests.NewSessionRequest;
 import org.apache.tajo.ws.rs.requests.SubmitQueryRequest;
@@ -74,7 +75,7 @@ public class TestTablesResource extends QueryTestCaseBase {
 		queriesURI = new URI(restServiceURI + "/queries");
 		sessionsURI = new URI(restServiceURI + "/sessions");
 		restClient = ClientBuilder.newBuilder()
-        .register(new GsonFeature(RestTestUtils.registerTypeAdapterMap()))
+        .register(new GsonFeature(PlanGsonHelper.registerAdapters()))
         .register(LoggingFilter.class)
         .property(ClientProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true)
         .property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, true)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 8472020..9ccfeb7 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
@@ -24,6 +24,7 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.partition.PartitionMethodDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
@@ -69,7 +70,7 @@ public class TPCH extends BenchmarkSet {
 
   @Override
   public void loadSchemas() {
-    Schema lineitem = new Schema()
+    Schema lineitem = SchemaFactory.newV1()
         .addColumn("l_orderkey", Type.INT4) // 0
         .addColumn("l_partkey", Type.INT4) // 1
         .addColumn("l_suppkey", Type.INT4) // 2
@@ -90,7 +91,7 @@ public class TPCH extends BenchmarkSet {
         .addColumn("l_comment", Type.TEXT); // 15
     schemas.put(LINEITEM, lineitem);
 
-    Schema customer = new Schema()
+    Schema customer = SchemaFactory.newV1()
         .addColumn("c_custkey", Type.INT4) // 0
         .addColumn("c_name", Type.TEXT) // 1
         .addColumn("c_address", Type.TEXT) // 2
@@ -101,7 +102,7 @@ public class TPCH extends BenchmarkSet {
         .addColumn("c_comment", Type.TEXT); // 7
     schemas.put(CUSTOMER, customer);
 
-    Schema customerParts = new Schema()
+    Schema customerParts = SchemaFactory.newV1()
         .addColumn("c_custkey", Type.INT4) // 0
         .addColumn("c_name", Type.TEXT) // 1
         .addColumn("c_address", Type.TEXT) // 2
@@ -111,14 +112,14 @@ public class TPCH extends BenchmarkSet {
         .addColumn("c_comment", Type.TEXT); // 6
     schemas.put(CUSTOMER_PARTS, customerParts);
 
-    Schema nation = new Schema()
+    Schema nation = SchemaFactory.newV1()
         .addColumn("n_nationkey", Type.INT4) // 0
         .addColumn("n_name", Type.TEXT) // 1
         .addColumn("n_regionkey", Type.INT4) // 2
         .addColumn("n_comment", Type.TEXT); // 3
     schemas.put(NATION, nation);
 
-    Schema part = new Schema()
+    Schema part = SchemaFactory.newV1()
         .addColumn("p_partkey", Type.INT4) // 0
         .addColumn("p_name", Type.TEXT) // 1
         .addColumn("p_mfgr", Type.TEXT) // 2
@@ -130,13 +131,13 @@ public class TPCH extends BenchmarkSet {
         .addColumn("p_comment", Type.TEXT); // 8
     schemas.put(PART, part);
 
-    Schema region = new Schema()
+    Schema region = SchemaFactory.newV1()
         .addColumn("r_regionkey", Type.INT4) // 0
         .addColumn("r_name", Type.TEXT) // 1
         .addColumn("r_comment", Type.TEXT); // 2
     schemas.put(REGION, region);
 
-    Schema orders = new Schema()
+    Schema orders = SchemaFactory.newV1()
         .addColumn("o_orderkey", Type.INT4) // 0
         .addColumn("o_custkey", Type.INT4) // 1
         .addColumn("o_orderstatus", Type.TEXT) // 2
@@ -151,7 +152,7 @@ public class TPCH extends BenchmarkSet {
     schemas.put(EMPTY_ORDERS, orders);
 
 
-    Schema partsupp = new Schema()
+    Schema partsupp = SchemaFactory.newV1()
         .addColumn("ps_partkey", Type.INT4) // 0
         .addColumn("ps_suppkey", Type.INT4) // 1
         .addColumn("ps_availqty", Type.INT4) // 2
@@ -159,7 +160,7 @@ public class TPCH extends BenchmarkSet {
         .addColumn("ps_comment", Type.TEXT); // 4
     schemas.put(PARTSUPP, partsupp);
 
-    Schema supplier = new Schema()
+    Schema supplier = SchemaFactory.newV1()
         .addColumn("s_suppkey", Type.INT4) // 0
         .addColumn("s_name", Type.TEXT) // 1
         .addColumn("s_address", Type.TEXT) // 2
@@ -171,7 +172,7 @@ public class TPCH extends BenchmarkSet {
   }
 
   public void loadOutSchema() {
-    Schema q2 = new Schema()
+    Schema q2 = SchemaFactory.newV1()
         .addColumn("s_acctbal", Type.FLOAT8)
         .addColumn("s_name", Type.TEXT)
         .addColumn("n_name", Type.TEXT)
@@ -207,7 +208,7 @@ public class TPCH extends BenchmarkSet {
 
     PartitionMethodDesc partitionMethodDesc = null;
     if (tableName.equals(CUSTOMER_PARTS)) {
-      Schema expressionSchema = new Schema();
+      Schema expressionSchema = SchemaFactory.newV1();
       expressionSchema.addColumn("c_nationkey", TajoDataTypes.Type.INT4);
       partitionMethodDesc = new PartitionMethodDesc(
           tajo.getCurrentDatabase(),

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java b/tajo-core/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java
index ea5e13d..a922ca8 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/json/CoreGsonHelper.java
@@ -21,8 +21,10 @@ package org.apache.tajo.engine.json;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.json.FunctionAdapter;
+import org.apache.tajo.catalog.json.SchemaAdapter;
 import org.apache.tajo.catalog.json.TableMetaAdapter;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
@@ -34,6 +36,7 @@ import org.apache.tajo.plan.logical.LogicalNode;
 import org.apache.tajo.function.Function;
 import org.apache.tajo.plan.serder.EvalNodeAdapter;
 import org.apache.tajo.plan.serder.LogicalNodeAdapter;
+import org.apache.tajo.plan.serder.PlanGsonHelper;
 
 import java.lang.reflect.Type;
 import java.util.HashMap;
@@ -46,27 +49,10 @@ public class CoreGsonHelper {
 
   private CoreGsonHelper() {
   }
-	
-	private static Map<Type, GsonSerDerAdapter> registerAdapters() {
-    Map<Type, GsonSerDerAdapter> adapters = new HashMap<>();
-    adapters.put(Path.class, new PathSerializer());
-    adapters.put(Class.class, new ClassNameSerializer());
-    adapters.put(LogicalNode.class, new LogicalNodeAdapter());
-    adapters.put(EvalNode.class, new EvalNodeAdapter());
-    adapters.put(TableMeta.class, new TableMetaAdapter());
-    adapters.put(Function.class, new FunctionAdapter());
-    adapters.put(GeneralFunction.class, new FunctionAdapter());
-    adapters.put(AggFunction.class, new FunctionAdapter());
-    adapters.put(Datum.class, new DatumAdapter());
-    adapters.put(DataType.class, new DataTypeAdapter());
-    adapters.put(TimeZone.class, new TimeZoneGsonSerdeAdapter());
-
-    return adapters;
-	}
 
 	public static Gson getInstance() {
 	  if (gson == null ) {
-      GsonHelper helper = new GsonHelper(registerAdapters());
+      GsonHelper helper = new GsonHelper(PlanGsonHelper.registerAdapters());
       gson = helper.getGson();
 	  }
 	  return gson;
@@ -77,7 +63,7 @@ public class CoreGsonHelper {
       GsonBuilder prettyBuilder = new GsonBuilder()
           .setPrettyPrinting()
           .excludeFieldsWithoutExposeAnnotation();
-      GsonHelper.registerAdapters(prettyBuilder, registerAdapters());
+      GsonHelper.registerAdapters(prettyBuilder, PlanGsonHelper.registerAdapters());
       gsonPretty = prettyBuilder.create();
     }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/DataChannel.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/DataChannel.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/DataChannel.java
index 10e9973..3e6e6bf 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/DataChannel.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/DataChannel.java
@@ -23,6 +23,7 @@ import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.ExecutionBlockId;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.SchemaUtil;
 import org.apache.tajo.util.StringUtils;
 
@@ -68,7 +69,7 @@ public class DataChannel {
     this.transmitType = proto.getTransmitType();
     this.shuffleType = proto.getShuffleType();
     if (proto.hasSchema()) {
-      this.setSchema(new Schema(proto.getSchema()));
+      this.setSchema(SchemaFactory.newV1(proto.getSchema()));
     }
     if (proto.getShuffleKeysCount() > 0) {
       shuffleKeys = new Column[proto.getShuffleKeysCount()];

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java
index 8f7673b..eb8f7ad 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/builder/DistinctGroupbyBuilder.java
@@ -23,6 +23,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.proto.CatalogProtos.SortSpecProto;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.engine.planner.global.DataChannel;
@@ -644,7 +645,7 @@ public class DistinctGroupbyBuilder {
     //Set SecondStage ColumnId and Input schema
     secondStageDistinctNode.setResultColumnIds(secondStageColumnIds);
 
-    Schema secondStageInSchema = new Schema();
+    Schema secondStageInSchema = SchemaFactory.newV1();
     //TODO merged tuple schema
     int index = 0;
     for(GroupbyNode eachNode: secondStageDistinctNode.getSubPlans()) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java
index 89c5b3d..8002989 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java
@@ -22,6 +22,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.IOUtils;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.catalog.proto.CatalogProtos.FragmentProto;
@@ -93,7 +94,7 @@ public class BSTIndexScanExec extends ScanExec {
   }
 
   private static Schema mergeSubSchemas(Schema originalSchema, Schema subSchema, List<Target> targets, EvalNode qual) {
-    Schema mergedSchema = new Schema();
+    Schema mergedSchema = SchemaFactory.newV1();
     Set<Column> qualAndTargets = new HashSet<>();
     qualAndTargets.addAll(EvalTreeUtil.findUniqueColumns(qual));
     for (Target target : targets) {
@@ -131,7 +132,7 @@ public class BSTIndexScanExec extends ScanExec {
     // in the case where projected column or expression are given
     // the target can be an empty list.
     if (plan.hasTargets()) {
-      projected = new Schema();
+      projected = SchemaFactory.newV1();
       Set<Column> columnSet = new HashSet<>();
 
       if (plan.hasQual()) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 bc667cb..1142095 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
@@ -25,10 +25,7 @@ import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.SessionVars;
-import org.apache.tajo.catalog.CatalogUtil;
-import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.TableMeta;
+import org.apache.tajo.catalog.*;
 import org.apache.tajo.catalog.proto.CatalogProtos.PartitionDescProto;
 import org.apache.tajo.catalog.proto.CatalogProtos.PartitionKeyProto;
 import org.apache.tajo.catalog.statistics.TableStats;
@@ -87,7 +84,7 @@ public abstract class ColPartitionStoreExec extends UnaryPhysicalExec {
     if (plan.getType() == NodeType.INSERT && keyNum > 0) {
       Column[] removedPartitionColumns = new Column[this.outSchema.size() - keyNum];
       System.arraycopy(this.outSchema.toArray(), 0, removedPartitionColumns, 0, removedPartitionColumns.length);
-      this.outSchema = new Schema(removedPartitionColumns);
+      this.outSchema = SchemaFactory.newV1(removedPartitionColumns);
     }
 
     keyIds = new int[keyNum];

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
index 3ddad1e..04b23f8 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
@@ -142,7 +142,7 @@ public class SeqScanExec extends ScanExec {
     // in the case where projected column or expression are given
     // the target can be an empty list.
     if (plan.hasTargets()) {
-      projected = new Schema();
+      projected = SchemaFactory.newV1();
       Set<Column> columnSet = new HashSet<>();
 
       if (plan.hasQual()) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java
index 44845e7..04a4a19 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/WindowAggExec.java
@@ -21,6 +21,7 @@ package org.apache.tajo.engine.planner.physical;
 import com.google.common.collect.Lists;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.plan.expr.EvalNode;
@@ -119,7 +120,7 @@ public class WindowAggExec extends UnaryPhysicalExec {
       endCurrentRowFlags = new boolean[functions.length];
 
       List<Column> additionalSortKeyColumns = Lists.newArrayList();
-      Schema rewrittenSchema = new Schema(outSchema);
+      Schema rewrittenSchema = SchemaFactory.newV1(outSchema);
       for (int i = 0; i < functions.length; i++) {
         WindowSpec.WindowEndBound endBound = functions[i].getWindowFrame().getEndBound();
         switch (endBound.getBoundType()) {
@@ -160,7 +161,7 @@ public class WindowAggExec extends UnaryPhysicalExec {
       }
 
       sortKeyColumns = new int[additionalSortKeyColumns.size()];
-      schemaForOrderBy = new Schema(outSchema);
+      schemaForOrderBy = SchemaFactory.newV1(outSchema);
       for (int i = 0; i < additionalSortKeyColumns.size(); i++) {
         sortKeyColumns[i] = i;
         schemaForOrderBy.addColumn(additionalSortKeyColumns.get(i));

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
index bfba51d..205329b 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
@@ -876,7 +876,7 @@ public class TajoMasterClientService extends AbstractService {
 
         Schema schema = null;
         if (request.hasSchema()) {
-          schema = new Schema(request.getSchema());
+          schema = SchemaFactory.newV1(request.getSchema());
         }
 
         TableMeta meta = new TableMeta(request.getMeta());

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainPlanPreprocessorForTest.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainPlanPreprocessorForTest.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainPlanPreprocessorForTest.java
index 2740728..47d4b4f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainPlanPreprocessorForTest.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/ExplainPlanPreprocessorForTest.java
@@ -21,6 +21,7 @@ package org.apache.tajo.master.exec;
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.exception.TajoException;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.Target;
@@ -154,7 +155,7 @@ public class ExplainPlanPreprocessorForTest {
       Column[] columns = schema.toArray();
       Arrays.sort(columns, columnComparator);
 
-      Schema sorted = new Schema();
+      Schema sorted = SchemaFactory.newV1();
       for (Column col : columns) {
         sorted.addColumn(col);
       }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 641e2b9..da11bd8 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
@@ -218,7 +218,7 @@ public class QueryExecutor {
       explainStr = PlannerUtil.buildExplainString(plan.getRootBlock().getRoot());
     }
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("explain", TajoDataTypes.Type.TEXT);
 
     SerializedResultSet.Builder serializedResBuilder = SerializedResultSet.newBuilder();

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java
index 4e4251a..8fdd6ce 100644
--- a/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java
+++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java
@@ -634,7 +634,7 @@ public class Repartitioner {
     ExecutionBlock sampleChildBlock = masterPlan.getChild(stage.getId(), 0);
     SortNode sortNode = PlannerUtil.findTopNode(sampleChildBlock.getPlan(), NodeType.SORT);
     SortSpec [] sortSpecs = sortNode.getSortKeys();
-    Schema sortSchema = new Schema(channel.getShuffleKeys());
+    Schema sortSchema = SchemaFactory.newV1(channel.getShuffleKeys());
 
     TupleRange[] ranges;
     int determinedTaskNum;

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-core/src/main/java/org/apache/tajo/ws/rs/TajoRestService.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/ws/rs/TajoRestService.java b/tajo-core/src/main/java/org/apache/tajo/ws/rs/TajoRestService.java
index 293192c..ba106d2 100644
--- a/tajo-core/src/main/java/org/apache/tajo/ws/rs/TajoRestService.java
+++ b/tajo-core/src/main/java/org/apache/tajo/ws/rs/TajoRestService.java
@@ -21,28 +21,10 @@ package org.apache.tajo.ws.rs;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.service.CompositeService;
-import org.apache.tajo.catalog.TableMeta;
-import org.apache.tajo.catalog.json.FunctionAdapter;
-import org.apache.tajo.catalog.json.TableMetaAdapter;
-import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.conf.TajoConf;
-import org.apache.tajo.datum.Datum;
-import org.apache.tajo.function.Function;
-import org.apache.tajo.json.ClassNameSerializer;
-import org.apache.tajo.json.DataTypeAdapter;
-import org.apache.tajo.json.DatumAdapter;
-import org.apache.tajo.json.GsonSerDerAdapter;
-import org.apache.tajo.json.PathSerializer;
-import org.apache.tajo.json.TimeZoneGsonSerdeAdapter;
 import org.apache.tajo.master.TajoMaster.MasterContext;
-import org.apache.tajo.plan.expr.EvalNode;
-import org.apache.tajo.plan.function.AggFunction;
-import org.apache.tajo.plan.function.GeneralFunction;
-import org.apache.tajo.plan.logical.LogicalNode;
-import org.apache.tajo.plan.serder.EvalNodeAdapter;
-import org.apache.tajo.plan.serder.LogicalNodeAdapter;
+import org.apache.tajo.plan.serder.PlanGsonHelper;
 import org.apache.tajo.ws.rs.netty.NettyRestServer;
 import org.apache.tajo.ws.rs.netty.NettyRestServerFactory;
 import org.apache.tajo.ws.rs.netty.gson.GsonFeature;
@@ -50,12 +32,8 @@ import org.glassfish.jersey.filter.LoggingFilter;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.server.ServerProperties;
 
-import java.lang.reflect.Type;
 import java.net.InetSocketAddress;
 import java.net.URI;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TimeZone;
 
 public class TajoRestService extends CompositeService {
   
@@ -69,27 +47,10 @@ public class TajoRestService extends CompositeService {
     
     this.masterContext = masterContext;
   }
-  
-  private Map<Type, GsonSerDerAdapter<?>> registerTypeAdapterMap() {
-    Map<Type, GsonSerDerAdapter<?>> adapters = new HashMap<>();
-    adapters.put(Path.class, new PathSerializer());
-    adapters.put(Class.class, new ClassNameSerializer());
-    adapters.put(LogicalNode.class, new LogicalNodeAdapter());
-    adapters.put(EvalNode.class, new EvalNodeAdapter());
-    adapters.put(TableMeta.class, new TableMetaAdapter());
-    adapters.put(Function.class, new FunctionAdapter());
-    adapters.put(GeneralFunction.class, new FunctionAdapter());
-    adapters.put(AggFunction.class, new FunctionAdapter());
-    adapters.put(Datum.class, new DatumAdapter());
-    adapters.put(DataType.class, new DataTypeAdapter());
-    adapters.put(TimeZone.class, new TimeZoneGsonSerdeAdapter());
-
-    return adapters;
-  }
 
   @Override
   protected void serviceInit(Configuration conf) throws Exception {
-    GsonFeature gsonFeature = new GsonFeature(registerTypeAdapterMap());
+    GsonFeature gsonFeature = new GsonFeature(PlanGsonHelper.registerAdapters());
     
     ClientApplication clientApplication = new ClientApplication(masterContext);
     ResourceConfig resourceConfig = ResourceConfig.forApplication(clientApplication)

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoDatabaseMetaData.java
----------------------------------------------------------------------
diff --git a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoDatabaseMetaData.java b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoDatabaseMetaData.java
index acb5b69..f4bf2b0 100644
--- a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoDatabaseMetaData.java
+++ b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoDatabaseMetaData.java
@@ -605,7 +605,7 @@ public class TajoDatabaseMetaData implements DatabaseMetaData {
         , new ArrayList<MetaDataTuple>());
   }
 
-  private final static Schema importedExportedSchema = new Schema()
+  private final static Schema importedExportedSchema = SchemaFactory.newV1()
       .addColumn("PKTABLE_CAT", Type.VARCHAR)   // 0
       .addColumn("PKTABLE_SCHEM", Type.VARCHAR) // 1
       .addColumn("PKTABLE_NAME", Type.VARCHAR)  // 2

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 4c926bb..0fbb9aa 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
@@ -69,7 +69,7 @@ public class TestResultSet {
     conf = util.getConfiguration();
     sm = TablespaceManager.getDefault();
 
-    scoreSchema = new Schema();
+    scoreSchema = SchemaFactory.newV1();
     scoreSchema.addColumn("deptname", Type.TEXT);
     scoreSchema.addColumn("score", Type.INT4);
     scoreMeta = CatalogUtil.newTableMeta("TEXT");
@@ -197,7 +197,7 @@ public class TestResultSet {
       String query = "select col1, col2, col3 from " + tableName;
 
       String [] table = new String[] {tableName};
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
       schema.addColumn("col1", Type.DATE);
       schema.addColumn("col2", Type.TIME);
       schema.addColumn("col3", Type.TIMESTAMP);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 3d8ad41..f791a3d 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
@@ -1228,7 +1228,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
   }
 
   private static Schema getNaturalJoinSchema(LogicalNode left, LogicalNode right) {
-    Schema joinSchema = new Schema();
+    Schema joinSchema = SchemaFactory.newV1();
     Schema commons = SchemaUtil.getNaturalJoinColumns(left.getOutSchema(), right.getOutSchema());
     joinSchema.addColumns(commons);
     for (Column c : left.getOutSchema().getRootColumns()) {
@@ -1677,7 +1677,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
       // See PreLogicalPlanVerifier.visitInsert.
       // It guarantees that the equivalence between the numbers of target and projected columns.
       ColumnReferenceExpr [] targets = expr.getTargetColumns();
-      Schema targetColumns = new Schema();
+      Schema targetColumns = SchemaFactory.newV1();
       for (ColumnReferenceExpr target : targets) {
         Column targetColumn = desc.getLogicalSchema().getColumn(target.getCanonicalName().replace(".", "/"));
 
@@ -1697,7 +1697,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
       Schema tableSchema = desc.getLogicalSchema();
       Schema projectedSchema = insertNode.getChild().getOutSchema();
 
-      Schema targetColumns = new Schema();
+      Schema targetColumns = SchemaFactory.newV1();
       for (int i = 0; i < projectedSchema.size(); i++) {
         targetColumns.addColumn(tableSchema.getColumn(i));
       }
@@ -1956,7 +1956,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
               queryOutputSchema.size() < partitionExpressionSchema.size()) {
             throw makeSyntaxError("Partition columns cannot be more than table columns.");
           }
-          Schema tableSchema = new Schema();
+          Schema tableSchema = SchemaFactory.newV1();
           for (int i = 0; i < queryOutputSchema.size() - partitionExpressionSchema.size(); i++) {
             tableSchema.addColumn(queryOutputSchema.getColumn(i));
           }
@@ -1964,7 +1964,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
           createTableNode.setTableSchema(tableSchema);
         } else {
           // Convert the schema of subquery into the target table's one.
-          Schema schema = new Schema(subQuery.getOutSchema());
+          Schema schema = SchemaFactory.newV1(subQuery.getOutSchema());
           schema.setQualifier(createTableNode.getTableName());
           createTableNode.setOutSchema(schema);
           createTableNode.setTableSchema(schema);
@@ -2040,7 +2040,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
    * @return schema transformed from table definition elements
    */
   private Schema convertColumnsToSchema(ColumnDefinition[] elements) {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
 
     for (ColumnDefinition columnDefinition: elements) {
       schema.addColumn(convertColumn(columnDefinition));
@@ -2056,7 +2056,7 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
    * @return schema transformed from table definition elements
    */
   private static Schema convertTableElementsSchema(ColumnDefinition[] elements) {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
 
     for (ColumnDefinition columnDefinition: elements) {
       schema.addColumn(convertColumn(columnDefinition));

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
index 3318d35..31cd1c6 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/expr/EvalTreeUtil.java
@@ -27,6 +27,7 @@ import org.apache.tajo.annotation.Nullable;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.exception.TajoInternalError;
@@ -144,7 +145,7 @@ public class EvalTreeUtil {
   }
   
   public static Schema getSchemaByTargets(Schema inputSchema, List<Target> targets) {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     for (Target target : targets) {
       schema.addColumn(
           target.hasAlias() ? target.getAlias() : target.getEvalTree().getName(),

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 05a72fe..8bccdc4 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
@@ -290,7 +290,7 @@ public class PythonScriptEngine extends TajoScriptEngine {
   private final TableMeta pipeMeta = CatalogUtil.newTableMeta("TEXT");
 
   private final Tuple EMPTY_INPUT = new VTuple(0);
-  private final Schema EMPTY_SCHEMA = new Schema();
+  private final Schema EMPTY_SCHEMA = SchemaFactory.newV1();
 
   public PythonScriptEngine(FunctionDesc functionDesc) {
     if (!functionDesc.getInvocation().hasPython() && !functionDesc.getInvocation().hasPythonAggregation()) {
@@ -388,27 +388,27 @@ public class PythonScriptEngine extends TajoScriptEngine {
   private void setSchema() {
     if (invocationDesc.isScalarFunction()) {
       TajoDataTypes.DataType[] paramTypes = functionSignature.getParamTypes();
-      inSchema = new Schema();
+      inSchema = SchemaFactory.newV1();
       for (int i = 0; i < paramTypes.length; i++) {
         inSchema.addColumn(new Column("in_" + i, paramTypes[i]));
       }
-      outSchema = new Schema(new Column[]{new Column("out", functionSignature.getReturnType())});
+      outSchema = SchemaFactory.newV1(new Column[]{new Column("out", functionSignature.getReturnType())});
     } else {
       // UDAF
       if (firstPhase) {
         // first phase
         TajoDataTypes.DataType[] paramTypes = functionSignature.getParamTypes();
-        inSchema = new Schema();
+        inSchema = SchemaFactory.newV1();
         for (int i = 0; i < paramTypes.length; i++) {
           inSchema.addColumn(new Column("in_" + i, paramTypes[i]));
         }
-        outSchema = new Schema(new Column[]{new Column("json", TajoDataTypes.Type.TEXT)});
+        outSchema = SchemaFactory.newV1(new Column[]{new Column("json", TajoDataTypes.Type.TEXT)});
       } else if (lastPhase) {
-        inSchema = new Schema(new Column[]{new Column("json", TajoDataTypes.Type.TEXT)});
-        outSchema = new Schema(new Column[]{new Column("out", functionSignature.getReturnType())});
+        inSchema = SchemaFactory.newV1(new Column[]{new Column("json", TajoDataTypes.Type.TEXT)});
+        outSchema = SchemaFactory.newV1(new Column[]{new Column("out", functionSignature.getReturnType())});
       } else {
         // intermediate phase
-        inSchema = outSchema = new Schema(new Column[]{new Column("json", TajoDataTypes.Type.TEXT)});
+        inSchema = outSchema = SchemaFactory.newV1(new Column[]{new Column("json", TajoDataTypes.Type.TEXT)});
       }
     }
     projectionCols = new int[outSchema.size()];

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/CreateTableNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/CreateTableNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/CreateTableNode.java
index c863034..3fed563 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/CreateTableNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/CreateTableNode.java
@@ -21,6 +21,7 @@ package org.apache.tajo.plan.logical;
 import com.google.common.base.Objects;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.util.TUtil;
 
@@ -41,7 +42,7 @@ public class CreateTableNode extends StoreTableNode implements Cloneable {
 
   public Schema getLogicalSchema() {
     if (hasPartition()) {
-      Schema logicalSchema = new Schema(tableSchema);
+      Schema logicalSchema = SchemaFactory.newV1(tableSchema);
       logicalSchema.addColumns(getPartitionMethod().getExpressionSchema());
       return logicalSchema;
     } else {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/InsertNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/InsertNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/InsertNode.java
index eae18bb..a993d64 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/InsertNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/InsertNode.java
@@ -21,6 +21,7 @@ package org.apache.tajo.plan.logical;
 import com.google.gson.annotations.Expose;
 
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.util.TUtil;
@@ -123,9 +124,9 @@ public class InsertNode extends StoreTableNode implements Cloneable {
   public Object clone() throws CloneNotSupportedException {
     InsertNode insertNode = (InsertNode) super.clone();
     insertNode.overwrite = overwrite;
-    insertNode.tableSchema = new Schema(tableSchema);
-    insertNode.targetSchema = targetSchema != null ? new Schema(targetSchema) : null;
-    insertNode.projectedSchema = projectedSchema != null ? new Schema(projectedSchema) : null;
+    insertNode.tableSchema = SchemaFactory.newV1(tableSchema);
+    insertNode.targetSchema = targetSchema != null ? SchemaFactory.newV1(targetSchema) : null;
+    insertNode.projectedSchema = projectedSchema != null ? SchemaFactory.newV1(projectedSchema) : null;
     insertNode.uri = uri != null ? uri : null;
     return insertNode;
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java
index a3b8001..5427ba6 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/logical/ScanNode.java
@@ -22,10 +22,7 @@ import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.gson.annotations.Expose;
 import org.apache.commons.lang.StringUtils;
-import org.apache.tajo.catalog.CatalogUtil;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.SchemaUtil;
-import org.apache.tajo.catalog.TableDesc;
+import org.apache.tajo.catalog.*;
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.plan.Target;
 import org.apache.tajo.plan.expr.EvalNode;
@@ -84,7 +81,7 @@ public class ScanNode extends RelationNode implements Projectable, SelectableNod
     String qualifiedAlias = CatalogUtil.buildFQName(databaseName, alias);
     this.setInSchema(tableDesc.getSchema());
     this.getInSchema().setQualifier(qualifiedAlias);
-    this.setOutSchema(new Schema(getInSchema()));
+    this.setOutSchema(SchemaFactory.newV1(getInSchema()));
     logicalSchema = SchemaUtil.getQualifiedLogicalSchema(tableDesc, qualifiedAlias);
 	}
 	

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/SelfDescSchemaBuildPhase.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/SelfDescSchemaBuildPhase.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/SelfDescSchemaBuildPhase.java
index 59adfc5..c5ca1ef 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/SelfDescSchemaBuildPhase.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/SelfDescSchemaBuildPhase.java
@@ -401,7 +401,7 @@ public class SelfDescSchemaBuildPhase extends LogicalPlanPreprocessPhase {
     private Schema buildSchemaFromColumnSet(Set<Column> columns) throws TajoException {
       SchemaGraph schemaGraph = new SchemaGraph();
       Set<ColumnVertex> rootVertexes = new HashSet<>();
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
 
       Set<Column> simpleColumns = new HashSet<>();
       List<Column> columnList = new ArrayList<>(columns);
@@ -523,7 +523,7 @@ public class SelfDescSchemaBuildPhase extends LogicalPlanPreprocessPhase {
         if (graph.isLeaf(schemaVertex)) {
           schemaVertex.column = new Column(schemaVertex.name, schemaVertex.type);
         } else {
-          Schema schema = new Schema();
+          Schema schema = SchemaFactory.newV1();
           for (ColumnVertex eachChild : graph.getChilds(schemaVertex)) {
             schema.addColumn(eachChild.column);
           }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/IndexScanInfo.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/IndexScanInfo.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/IndexScanInfo.java
index 9ac8ccf..26c27b3 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/IndexScanInfo.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/IndexScanInfo.java
@@ -21,6 +21,7 @@ package org.apache.tajo.plan.rewrite.rules;
 import com.google.gson.annotations.Expose;
 import org.apache.tajo.catalog.IndexDesc;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.common.ProtoObject;
@@ -92,7 +93,7 @@ public class IndexScanInfo extends AccessPathInfo {
   public IndexScanInfo(TableStats tableStats, IndexDesc indexDesc, SimplePredicate[] predicates) {
     super(ScanTypeControl.INDEX_SCAN, tableStats);
     this.indexPath = indexDesc.getIndexPath();
-    keySchema = new Schema();
+    keySchema = SchemaFactory.newV1();
     this.predicates = predicates;
     for (SimplePredicate predicate : predicates) {
       keySchema.addColumn(predicate.getKeySortSpec().getSortKey());

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/PartitionedTableRewriter.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/PartitionedTableRewriter.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/PartitionedTableRewriter.java
index cf54f7b..00580ae 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/PartitionedTableRewriter.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/PartitionedTableRewriter.java
@@ -334,7 +334,7 @@ public class PartitionedTableRewriter implements LogicalPlanRewriteRule {
     TableDesc table = scanNode.getTableDesc();
     PartitionMethodDesc partitionDesc = scanNode.getTableDesc().getPartitionMethod();
 
-    Schema paritionValuesSchema = new Schema();
+    Schema paritionValuesSchema = SchemaFactory.newV1();
     for (Column column : partitionDesc.getExpressionSchema().getRootColumns()) {
       paritionValuesSchema.addColumn(column);
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
index e8c0d4f..4b47e4a 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/LogicalNodeDeserializer.java
@@ -24,10 +24,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.tajo.OverridableConf;
 import org.apache.tajo.algebra.JoinType;
 import org.apache.tajo.annotation.Nullable;
-import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.SortSpec;
-import org.apache.tajo.catalog.TableDesc;
+import org.apache.tajo.catalog.*;
 import org.apache.tajo.catalog.partition.PartitionMethodDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.exception.NotImplementedException;
@@ -449,7 +446,7 @@ public class LogicalNodeDeserializer {
       predicates[i] = new SimplePredicate(indexScanSpec.getPredicates(i));
     }
 
-    indexScan.set(new Schema(indexScanSpec.getKeySchema()), predicates,
+    indexScan.set(SchemaFactory.newV1(indexScanSpec.getKeySchema()), predicates,
         TUtil.stringToURI(indexScanSpec.getIndexPath()));
 
     return indexScan;
@@ -683,7 +680,7 @@ public class LogicalNodeDeserializer {
     for (int i = 0; i < keySortSpecs.length; i++) {
       keySortSpecs[i] = new SortSpec(createIndexProto.getKeySortSpecs(i));
     }
-    createIndex.setKeySortSpecs(new Schema(createIndexProto.getTargetRelationSchema()),
+    createIndex.setKeySortSpecs(SchemaFactory.newV1(createIndexProto.getTargetRelationSchema()),
         keySortSpecs);
     createIndex.setUnique(createIndexProto.getIsUnique());
     createIndex.setClustered(createIndexProto.getIsClustered());
@@ -727,7 +724,7 @@ public class LogicalNodeDeserializer {
   }
 
   public static Schema convertSchema(CatalogProtos.SchemaProto proto) {
-    return new Schema(proto);
+    return SchemaFactory.newV1(proto);
   }
 
   public static Column[] convertColumns(List<CatalogProtos.ColumnProto> columnProtos) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-plan/src/main/java/org/apache/tajo/plan/serder/PlanGsonHelper.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/PlanGsonHelper.java b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/PlanGsonHelper.java
index 875f1d1..77bf103 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/serder/PlanGsonHelper.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/serder/PlanGsonHelper.java
@@ -21,8 +21,10 @@ package org.apache.tajo.plan.serder;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import org.apache.hadoop.fs.Path;
+import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.json.FunctionAdapter;
+import org.apache.tajo.catalog.json.SchemaAdapter;
 import org.apache.tajo.catalog.json.TableMetaAdapter;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
@@ -45,8 +47,8 @@ public class PlanGsonHelper {
   private PlanGsonHelper() {
   }
 	
-	private static Map<Type, GsonSerDerAdapter> registerAdapters() {
-    Map<Type, GsonSerDerAdapter> adapters = new HashMap<>();
+	public static Map<Type, GsonSerDerAdapter<?>> registerAdapters() {
+    Map<Type, GsonSerDerAdapter<?>> adapters = new HashMap<>();
     adapters.put(Path.class, new PathSerializer());
     adapters.put(Class.class, new ClassNameSerializer());
     adapters.put(LogicalNode.class, new LogicalNodeAdapter());
@@ -58,6 +60,7 @@ public class PlanGsonHelper {
     adapters.put(Datum.class, new DatumAdapter());
     adapters.put(DataType.class, new DataTypeAdapter());
     adapters.put(TimeZone.class, new TimeZoneGsonSerdeAdapter());
+    adapters.put(Schema.class, new SchemaAdapter());
 
     return adapters;
 	}

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
----------------------------------------------------------------------
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
index 6897e17..eccd37a 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/util/PlannerUtil.java
@@ -565,7 +565,7 @@ public class PlannerUtil {
   }
 
   public static Schema sortSpecsToSchema(SortSpec[] sortSpecs) {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     for (SortSpec spec : sortSpecs) {
       schema.addColumn(spec.getSortKey());
     }
@@ -656,7 +656,7 @@ public class PlannerUtil {
   }
 
   public static Schema targetToSchema(List<Target> targets) {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     for (Target t : targets) {
       DataType type = t.getEvalTree().getValueType();
       String name;

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 56edccc..f3acb00 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
@@ -22,6 +22,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.plan.logical.GroupbyNode;
 import org.apache.tajo.plan.logical.JoinNode;
@@ -35,7 +36,7 @@ public class TestLogicalNode {
 
   @Test
   public void testEquals() {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("name", Type.TEXT);
     schema.addColumn("age", Type.INT2);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java
index 921563a..2d6d398 100644
--- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java
+++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/BaseTupleComparator.java
@@ -20,6 +20,7 @@ package org.apache.tajo.storage;
 
 import com.google.common.base.Preconditions;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.common.ProtoObject;
 import org.apache.tajo.datum.Datum;
@@ -68,7 +69,7 @@ public class BaseTupleComparator extends TupleComparator implements ProtoObject<
   }
 
   public BaseTupleComparator(TupleComparatorProto proto) {
-    this.schema = new Schema(proto.getSchema());
+    this.schema = SchemaFactory.newV1(proto.getSchema());
 
     this.sortSpecs = new SortSpec[proto.getSortSpecsCount()];
     for (int i = 0; i < proto.getSortSpecsCount(); i++) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/MergeScanner.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/MergeScanner.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/MergeScanner.java
index 04d7fed..ec20aca 100644
--- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/MergeScanner.java
+++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/MergeScanner.java
@@ -21,6 +21,7 @@ package org.apache.tajo.storage;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.statistics.ColumnStats;
 import org.apache.tajo.catalog.statistics.TableStats;
@@ -165,7 +166,7 @@ public class MergeScanner implements Scanner {
 
   @Override
   public void setTarget(Column[] targets) {
-    this.target = new Schema(targets);
+    this.target = SchemaFactory.newV1(targets);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TupleRange.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TupleRange.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TupleRange.java
index c42cdd6..560e642 100644
--- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TupleRange.java
+++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TupleRange.java
@@ -20,6 +20,7 @@ package org.apache.tajo.storage;
 
 import com.google.common.base.Objects;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.SortSpec;
 
 /**
@@ -38,7 +39,7 @@ public class TupleRange implements Comparable<TupleRange>, Cloneable {
   }
 
   public static Schema sortSpecsToSchema(SortSpec[] sortSpecs) {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     for (SortSpec spec : sortSpecs) {
       schema.addColumn(spec.getSortKey());
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestLazyTuple.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestLazyTuple.java b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestLazyTuple.java
index 96f90e7..df5d3b0 100644
--- a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestLazyTuple.java
+++ b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestLazyTuple.java
@@ -20,6 +20,7 @@ package org.apache.tajo.storage;
 
 
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
@@ -40,7 +41,7 @@ public class TestLazyTuple {
   public void setUp() {
     nullbytes = "\\N".getBytes();
 
-    schema = new Schema();
+    schema = SchemaFactory.newV1();
     schema.addColumn("col1", TajoDataTypes.Type.BOOLEAN);
     schema.addColumn("col2", TajoDataTypes.Type.BIT);
     schema.addColumn("col3", TajoDataTypes.Type.CHAR, 7);
@@ -197,7 +198,7 @@ public class TestLazyTuple {
   @Test
   public void testInvalidNumber() {
     byte[][] bytes = BytesUtils.splitPreserveAllTokens(" 1| |2 ||".getBytes(), '|', 5);
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", TajoDataTypes.Type.INT2);
     schema.addColumn("col2", TajoDataTypes.Type.INT4);
     schema.addColumn("col3", TajoDataTypes.Type.INT8);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestTupleComparator.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestTupleComparator.java b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestTupleComparator.java
index 52622ee..e5d8464 100644
--- a/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestTupleComparator.java
+++ b/tajo-storage/tajo-storage-common/src/test/java/org/apache/tajo/storage/TestTupleComparator.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.storage;
 
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.*;
@@ -44,7 +45,7 @@ public class TestTupleComparator {
 
   @Test
   public final void testCompare() {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.INT4);
     schema.addColumn("col2", Type.INT4);
     schema.addColumn("col3", Type.INT4);
@@ -77,7 +78,7 @@ public class TestTupleComparator {
 
   @Test
   public void testNullFirst() throws Exception {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("name", Type.TEXT);
 
@@ -117,7 +118,7 @@ public class TestTupleComparator {
 
   @Test
   public void testNullLast() throws Exception {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("name", Type.TEXT);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-storage/tajo-storage-hbase/src/test/java/org/apache/tajo/storage/hbase/TestColumnMapping.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hbase/src/test/java/org/apache/tajo/storage/hbase/TestColumnMapping.java b/tajo-storage/tajo-storage-hbase/src/test/java/org/apache/tajo/storage/hbase/TestColumnMapping.java
index bfdc8ca..6713519 100644
--- a/tajo-storage/tajo-storage-hbase/src/test/java/org/apache/tajo/storage/hbase/TestColumnMapping.java
+++ b/tajo-storage/tajo-storage-hbase/src/test/java/org/apache/tajo/storage/hbase/TestColumnMapping.java
@@ -19,6 +19,7 @@
 package org.apache.tajo.storage.hbase;
 
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.util.KeyValueSet;
@@ -35,7 +36,7 @@ public class TestColumnMapping {
     keyValueSet.set(HBaseStorageConstants.META_TABLE_KEY, "test");
     keyValueSet.set(HBaseStorageConstants.META_COLUMNS_KEY, ":key,col2:key:,col2:value:#b,col3:");
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("c1", Type.TEXT);
     schema.addColumn("c2", Type.TEXT);
     schema.addColumn("c3", Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/index/bst/BSTIndex.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/index/bst/BSTIndex.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/index/bst/BSTIndex.java
index e0051f4..01a6e7f 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/index/bst/BSTIndex.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/index/bst/BSTIndex.java
@@ -26,6 +26,7 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.*;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.proto.CatalogProtos.SchemaProto;
 import org.apache.tajo.storage.*;
 import org.apache.tajo.storage.RowStoreUtil.RowStoreDecoder;
@@ -543,7 +544,7 @@ public class BSTIndex implements IndexMethod {
       SchemaProto.Builder builder = SchemaProto.newBuilder();
       builder.mergeFrom(schemaBytes);
       SchemaProto proto = builder.build();
-      this.keySchema = new Schema(proto);
+      this.keySchema = SchemaFactory.newV1(proto);
       this.rowStoreDecoder = RowStoreUtil.createDecoder(keySchema);
 
       // comparator

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/ParquetScanner.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/ParquetScanner.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/ParquetScanner.java
index 0c4749c..4bdb4f4 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/ParquetScanner.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/ParquetScanner.java
@@ -20,6 +20,7 @@ package org.apache.tajo.storage.parquet;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.exception.NotImplementedException;
 import org.apache.tajo.exception.TajoRuntimeException;
@@ -63,7 +64,7 @@ public class ParquetScanner extends FileScanner {
     if (targets == null) {
       targets = schema.toArray();
     }
-    reader = new TajoParquetReader(conf, fragment.getPath(), schema, new Schema(targets));
+    reader = new TajoParquetReader(conf, fragment.getPath(), schema, SchemaFactory.newV1(targets));
     totalRowCount = reader.getTotalRowCount();
     currentRowCount = 0;
     closed = false;

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/TajoSchemaConverter.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/TajoSchemaConverter.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/TajoSchemaConverter.java
index dfe6af8..b2f3f34 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/TajoSchemaConverter.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/parquet/TajoSchemaConverter.java
@@ -25,6 +25,7 @@ import org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName;
 import org.apache.parquet.schema.Type;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.common.TajoDataTypes;
 
 import java.util.ArrayList;
@@ -64,7 +65,7 @@ public class TajoSchemaConverter {
     }
     Column[] columnsArray = new Column[columns.size()];
     columnsArray = columns.toArray(columnsArray);
-    return new Schema(columnsArray);
+    return SchemaFactory.newV1(columnsArray);
   }
 
   private Column convertField(final Type fieldType) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/OrcRecordReader.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/OrcRecordReader.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/OrcRecordReader.java
index 7194bf4..df9a7c7 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/OrcRecordReader.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/thirdparty/orc/OrcRecordReader.java
@@ -31,6 +31,7 @@ import org.apache.orc.impl.*;
 import org.apache.orc.impl.StreamName;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.storage.VTuple;
@@ -91,7 +92,7 @@ public class OrcRecordReader implements Closeable {
     this.bufferSize = bufferSize;
     this.included = new boolean[schema.size() + 1];
     included[0] = target.length > 0; // always include root column except when target schema size is 0
-    Schema targetSchema = new Schema(target);
+    Schema targetSchema = SchemaFactory.newV1(target);
     for (int i = 1; i < included.length; i++) {
       included[i] = targetSchema.contains(schema.getColumn(i - 1));
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 608d066..d18961f 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
@@ -31,6 +31,7 @@ import org.apache.orc.OrcConf;
 import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -112,7 +113,7 @@ public class TestCompressionStorages {
   }
 
   private void storageCompressionTest(String dataFormat, Class<? extends CompressionCodec> codec) throws IOException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("age", Type.FLOAT4);
     schema.addColumn("name", Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 6ff291c..523a0d0 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
@@ -25,6 +25,7 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
@@ -41,7 +42,7 @@ import static org.junit.Assert.*;
 public class TestDelimitedTextFile {
   private static final Log LOG = LogFactory.getLog(TestDelimitedTextFile.class);
 
-  private static Schema schema = new Schema();
+  private static Schema schema = SchemaFactory.newV1();
 
   private static Tuple baseTuple;
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 e9e44b5..59ff6f6 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
@@ -24,6 +24,7 @@ import org.apache.hadoop.fs.LocalFileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
@@ -97,7 +98,7 @@ public class TestFileSystems {
   @Test
   public void testBlockSplit() throws IOException {
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("age", Type.INT4);
     schema.addColumn("name", Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 58025c3..b8f9893 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
@@ -27,6 +27,7 @@ import org.apache.hadoop.hdfs.*;
 import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
@@ -81,7 +82,7 @@ public class TestFileTablespace {
 
   @Test
 	public final void testGetScannerAndAppender() throws IOException {
-		Schema schema = new Schema();
+		Schema schema = SchemaFactory.newV1();
 		schema.addColumn("id", Type.INT4);
 		schema.addColumn("age",Type.INT4);
 		schema.addColumn("name",Type.TEXT);
@@ -144,7 +145,7 @@ public class TestFileTablespace {
       TablespaceManager.addTableSpaceForTest(space);
       assertEquals(fs.getUri(), space.getUri());
 
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
       schema.addColumn("id", Type.INT4);
       schema.addColumn("age",Type.INT4);
       schema.addColumn("name",Type.TEXT);
@@ -198,7 +199,7 @@ public class TestFileTablespace {
       TablespaceManager.addTableSpaceForTest(space);
       assertEquals(fs.getUri(), space.getUri());
 
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
       schema.addColumn("id", Type.INT4);
       schema.addColumn("age",Type.INT4);
       schema.addColumn("name",Type.TEXT);
@@ -241,7 +242,7 @@ public class TestFileTablespace {
       TablespaceManager.addTableSpaceForTest(sm);
       assertEquals(fs.getUri(), sm.getUri());
 
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
       schema.addColumn("id", Type.INT4);
       schema.addColumn("age", Type.INT4);
       schema.addColumn("name", Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 a478538..e47741c 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
@@ -27,6 +27,7 @@ import org.apache.hadoop.io.IOUtils;
 import org.apache.hadoop.io.compress.DeflateCodec;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
@@ -58,7 +59,7 @@ public class TestLineReader {
     Path testDir = CommonTestingUtil.getTestDir(TEST_PATH);
     FileSystem fs = testDir.getFileSystem(conf);
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("age", Type.INT8);
     schema.addColumn("comment", Type.TEXT);
@@ -110,7 +111,7 @@ public class TestLineReader {
     Path testDir = CommonTestingUtil.getTestDir(TEST_PATH);
     FileSystem fs = testDir.getFileSystem(conf);
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("age", Type.INT8);
     schema.addColumn("comment", Type.TEXT);
@@ -169,7 +170,7 @@ public class TestLineReader {
     Path testDir = CommonTestingUtil.getTestDir(TEST_PATH);
     FileSystem fs = testDir.getFileSystem(conf);
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("age", Type.INT8);
     schema.addColumn("comment", Type.TEXT);
@@ -275,7 +276,7 @@ public class TestLineReader {
     Path testDir = CommonTestingUtil.getTestDir(TEST_PATH);
     FileSystem fs = testDir.getFileSystem(conf);
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("age", Type.INT8);
     schema.addColumn("comment", Type.TEXT);

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 d8d3359..a04867e 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
@@ -23,6 +23,7 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -98,7 +99,7 @@ public class TestMergeScanner {
 
   @Test
   public void testMultipleFiles() throws IOException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("file", Type.TEXT);
     schema.addColumn("name", Type.TEXT);
@@ -160,7 +161,7 @@ public class TestMergeScanner {
     fragment[0] = new FileFragment("tablet1", table1Path, 0, status1.getLen());
     fragment[1] = new FileFragment("tablet1", table2Path, 0, status2.getLen());
 
-    Schema targetSchema = new Schema();
+    Schema targetSchema = SchemaFactory.newV1();
     targetSchema.addColumn(schema.getColumn(0));
     targetSchema.addColumn(schema.getColumn(2));
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/8dad551e/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 a9d61d5..64316d1 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
@@ -31,6 +31,7 @@ import org.apache.tajo.QueryId;
 import org.apache.tajo.TajoIdProtos;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
+import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -185,7 +186,7 @@ public class TestStorages {
   @Test
   public void testSplitable() throws IOException {
     if (splitable) {
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
       schema.addColumn("id", Type.INT4);
       schema.addColumn("age", Type.INT8);
 
@@ -239,7 +240,7 @@ public class TestStorages {
 
   @Test
   public void testZeroRows() throws IOException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("age", Type.INT8);
     schema.addColumn("score", Type.FLOAT4);
@@ -283,7 +284,7 @@ public class TestStorages {
   @Test
   public void testRCFileSplitable() throws IOException {
     if (dataFormat.equalsIgnoreCase(BuiltinStorages.RCFILE)) {
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
       schema.addColumn("id", Type.INT4);
       schema.addColumn("age", Type.INT8);
 
@@ -337,7 +338,7 @@ public class TestStorages {
 
   @Test
   public void testProjection() throws IOException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("age", Type.INT8);
     schema.addColumn("score", Type.FLOAT4);
@@ -368,7 +369,7 @@ public class TestStorages {
     FileStatus status = fs.getFileStatus(tablePath);
     FileFragment fragment = new FileFragment("testReadAndWrite", tablePath, 0, status.getLen());
 
-    Schema target = new Schema();
+    Schema target = SchemaFactory.newV1();
     target.addColumn("age", Type.INT8);
     target.addColumn("score", Type.FLOAT4);
     Scanner scanner = sm.getScanner(meta, schema, fragment, target);
@@ -400,7 +401,7 @@ public class TestStorages {
 
   @Test
   public void testVariousTypes() throws IOException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.BOOLEAN);
     schema.addColumn("col2", Type.CHAR, 7);
     schema.addColumn("col3", Type.INT2);
@@ -469,7 +470,7 @@ public class TestStorages {
 
   @Test
   public void testNullHandlingTypes() throws IOException {
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.BOOLEAN);
     schema.addColumn("col2", Type.CHAR, 7);
     schema.addColumn("col3", Type.INT2);
@@ -564,7 +565,7 @@ public class TestStorages {
   public void testNullHandlingTypesWithProjection() throws IOException {
     if (internalType) return;
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.BOOLEAN);
     schema.addColumn("col2", Type.CHAR, 7);
     schema.addColumn("col3", Type.INT2);
@@ -635,7 +636,7 @@ public class TestStorages {
 
 
     // Making projection schema with different column positions
-    Schema target = new Schema();
+    Schema target = SchemaFactory.newV1();
     Random random = new Random();
     for (int i = 1; i < schema.size(); i++) {
       int num = random.nextInt(schema.size() - 1) + 1;
@@ -670,7 +671,7 @@ public class TestStorages {
   public void testRCFileTextSerializeDeserialize() throws IOException {
     if(!dataFormat.equalsIgnoreCase(BuiltinStorages.RCFILE)) return;
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.BOOLEAN);
     schema.addColumn("col2", Type.BIT);
     schema.addColumn("col3", Type.CHAR, 7);
@@ -737,7 +738,7 @@ public class TestStorages {
   public void testRCFileBinarySerializeDeserialize() throws IOException {
     if(!dataFormat.equalsIgnoreCase(BuiltinStorages.RCFILE)) return;
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.BOOLEAN);
     schema.addColumn("col2", Type.BIT);
     schema.addColumn("col3", Type.CHAR, 7);
@@ -804,7 +805,7 @@ public class TestStorages {
   public void testSequenceFileTextSerializeDeserialize() throws IOException {
     if(!dataFormat.equalsIgnoreCase(BuiltinStorages.SEQUENCE_FILE)) return;
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.BOOLEAN);
     schema.addColumn("col2", Type.BIT);
     schema.addColumn("col3", Type.CHAR, 7);
@@ -874,7 +875,7 @@ public class TestStorages {
   public void testSequenceFileBinarySerializeDeserialize() throws IOException {
     if(!dataFormat.equalsIgnoreCase(BuiltinStorages.SEQUENCE_FILE)) return;
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.BOOLEAN);
     schema.addColumn("col2", Type.BIT);
     schema.addColumn("col3", Type.CHAR, 7);
@@ -945,7 +946,7 @@ public class TestStorages {
     if (dateTypeSupport() || timeTypeSupport()) {
 
       int index = 2;
-      Schema schema = new Schema();
+      Schema schema = SchemaFactory.newV1();
       schema.addColumn("col1", Type.TIMESTAMP);
       if (dateTypeSupport()) {
         schema.addColumn("col" + index++, Type.DATE);
@@ -996,7 +997,7 @@ public class TestStorages {
       return;
     }
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("age", Type.INT8);
     schema.addColumn("comment", Type.TEXT);
@@ -1071,7 +1072,7 @@ public class TestStorages {
   @Test
   public void testMaxValue() throws IOException {
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.FLOAT4);
     schema.addColumn("col2", Type.FLOAT8);
     schema.addColumn("col3", Type.INT2);
@@ -1138,7 +1139,7 @@ public class TestStorages {
       return;
     }
 
-    Schema dataSchema = new Schema();
+    Schema dataSchema = SchemaFactory.newV1();
     dataSchema.addColumn("col1", Type.FLOAT4);
     dataSchema.addColumn("col2", Type.FLOAT8);
     dataSchema.addColumn("col3", Type.INT2);
@@ -1166,7 +1167,7 @@ public class TestStorages {
 
     assertTrue(fs.exists(tablePath));
     FileStatus status = fs.getFileStatus(tablePath);
-    Schema inSchema = new Schema();
+    Schema inSchema = SchemaFactory.newV1();
     inSchema.addColumn("col1", Type.FLOAT4);
     inSchema.addColumn("col2", Type.FLOAT8);
     inSchema.addColumn("col3", Type.INT2);
@@ -1176,7 +1177,7 @@ public class TestStorages {
     FileFragment fragment = new FileFragment("table", tablePath, 0, status.getLen());
     Scanner scanner = TablespaceManager.getLocalFs().getScanner(meta, inSchema, fragment, null);
 
-    Schema target = new Schema();
+    Schema target = SchemaFactory.newV1();
 
     target.addColumn("col2", Type.FLOAT8);
     target.addColumn("col5", Type.INT8);
@@ -1204,7 +1205,7 @@ public class TestStorages {
       return;
     }
 
-    Schema dataSchema = new Schema();
+    Schema dataSchema = SchemaFactory.newV1();
     dataSchema.addColumn("col1", Type.CHAR);
 
     KeyValueSet options = new KeyValueSet();
@@ -1247,7 +1248,7 @@ public class TestStorages {
       return;
     }
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.TEXT);
 
     KeyValueSet options = new KeyValueSet();
@@ -1288,7 +1289,7 @@ public class TestStorages {
 
     if (internalType) return;
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("age", Type.INT8);
     schema.addColumn("score", Type.FLOAT4);
@@ -1323,7 +1324,7 @@ public class TestStorages {
   @Test
   public void testProgress() throws IOException {
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("col1", Type.FLOAT4);
     schema.addColumn("col2", Type.FLOAT8);
     schema.addColumn("col3", Type.INT2);
@@ -1371,7 +1372,7 @@ public class TestStorages {
   public void testEmptySchema() throws IOException {
     if (internalType) return;
 
-    Schema schema = new Schema();
+    Schema schema = SchemaFactory.newV1();
     schema.addColumn("id", Type.INT4);
     schema.addColumn("age", Type.INT8);
     schema.addColumn("score", Type.FLOAT4);
@@ -1409,7 +1410,7 @@ public class TestStorages {
     }
 
     //e,g select count(*) from table
-    Schema target = new Schema();
+    Schema target = SchemaFactory.newV1();
     assertEquals(0, target.size());
 
     FileFragment fragment = new FileFragment("table", tablePath, 0, status.getLen());