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/04/20 22:39:34 UTC

[1/6] tajo git commit: TAJO-2108: Refactor Schema to be immutable.

Repository: tajo
Updated Branches:
  refs/heads/master 71d2825cd -> 4aef83a39


http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 df5d3b0..76c2ef1 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
@@ -19,8 +19,9 @@
 package org.apache.tajo.storage;
 
 
+import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.SchemaFactory;
+import org.apache.tajo.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
@@ -41,24 +42,23 @@ public class TestLazyTuple {
   public void setUp() {
     nullbytes = "\\N".getBytes();
 
-    schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TajoDataTypes.Type.BOOLEAN);
-    schema.addColumn("col2", TajoDataTypes.Type.BIT);
-    schema.addColumn("col3", TajoDataTypes.Type.CHAR, 7);
-    schema.addColumn("col4", TajoDataTypes.Type.INT2);
-    schema.addColumn("col5", TajoDataTypes.Type.INT4);
-    schema.addColumn("col6", TajoDataTypes.Type.INT8);
-    schema.addColumn("col7", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col8", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col9", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col10", TajoDataTypes.Type.BLOB);
-    schema.addColumn("col11", TajoDataTypes.Type.INET4);
-    schema.addColumn("col12", TajoDataTypes.Type.INT4);
-    schema.addColumn("col13", TajoDataTypes.Type.NULL_TYPE);
+    schema = SchemaBuilder.builder()
+        .add("col1", TajoDataTypes.Type.BOOLEAN)
+        .add("col2", CatalogUtil.newDataTypeWithLen(TajoDataTypes.Type.CHAR, 7))
+        .add("col3", TajoDataTypes.Type.INT2)
+        .add("col4", TajoDataTypes.Type.INT4)
+        .add("col5", TajoDataTypes.Type.INT8)
+        .add("col6", TajoDataTypes.Type.FLOAT4)
+        .add("col7", TajoDataTypes.Type.FLOAT8)
+        .add("col8", TajoDataTypes.Type.TEXT)
+        .add("col9", TajoDataTypes.Type.BLOB)
+        .add("col10", TajoDataTypes.Type.INET4)
+        .add("col11", TajoDataTypes.Type.INT4)
+        .add("col12", TajoDataTypes.Type.NULL_TYPE)
+        .build();
 
     StringBuilder sb = new StringBuilder();
     sb.append(DatumFactory.createBool(true)).append('|');
-    sb.append(new String(DatumFactory.createBit((byte) 0x99).asTextBytes())).append('|');
     sb.append(DatumFactory.createChar("str")).append('|');
     sb.append(DatumFactory.createInt2((short) 17)).append('|');
     sb.append(DatumFactory.createInt4(59)).append('|');
@@ -80,18 +80,17 @@ public class TestLazyTuple {
 
     LazyTuple t1 = new LazyTuple(schema, textRow, -1, nullbytes, serde);
     assertEquals(DatumFactory.createBool(true), t1.get(0));
-    assertEquals(DatumFactory.createBit((byte) 0x99), t1.get(1));
-    assertEquals(DatumFactory.createChar("str"), t1.get(2));
-    assertEquals(DatumFactory.createInt2((short) 17), t1.get(3));
-    assertEquals(DatumFactory.createInt4(59), t1.get(4));
-    assertEquals(DatumFactory.createInt8(23l), t1.get(5));
-    assertEquals(DatumFactory.createFloat4(77.9f), t1.get(6));
-    assertEquals(DatumFactory.createFloat8(271.9f), t1.get(7));
-    assertEquals(DatumFactory.createText("str2"), t1.get(8));
-    assertEquals(DatumFactory.createBlob("jinho".getBytes()), t1.get(9));
-    assertEquals(DatumFactory.createInet4("192.168.0.1"), t1.get(10));
+    assertEquals(DatumFactory.createChar("str"), t1.get(1));
+    assertEquals(DatumFactory.createInt2((short) 17), t1.get(2));
+    assertEquals(DatumFactory.createInt4(59), t1.get(3));
+    assertEquals(DatumFactory.createInt8(23l), t1.get(4));
+    assertEquals(DatumFactory.createFloat4(77.9f), t1.get(5));
+    assertEquals(DatumFactory.createFloat8(271.9f), t1.get(6));
+    assertEquals(DatumFactory.createText("str2"), t1.get(7));
+    assertEquals(DatumFactory.createBlob("jinho".getBytes()), t1.get(8));
+    assertEquals(DatumFactory.createInet4("192.168.0.1"), t1.get(9));
+    assertEquals(NullDatum.get(), t1.get(10));
     assertEquals(NullDatum.get(), t1.get(11));
-    assertEquals(NullDatum.get(), t1.get(12));
   }
 
   @Test
@@ -115,7 +114,6 @@ public class TestLazyTuple {
     assertFalse(t1.contains(9));
     assertFalse(t1.contains(10));
     assertFalse(t1.contains(11));
-    assertFalse(t1.contains(12));
   }
 
   @Test
@@ -198,12 +196,13 @@ public class TestLazyTuple {
   @Test
   public void testInvalidNumber() {
     byte[][] bytes = BytesUtils.splitPreserveAllTokens(" 1| |2 ||".getBytes(), '|', 5);
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TajoDataTypes.Type.INT2);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT8);
-    schema.addColumn("col4", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TajoDataTypes.Type.INT2)
+        .add("col2", TajoDataTypes.Type.INT4)
+        .add("col3", TajoDataTypes.Type.INT8)
+        .add("col4", TajoDataTypes.Type.FLOAT4)
+        .add("col5", TajoDataTypes.Type.FLOAT8)
+        .build();
 
     LazyTuple tuple = new LazyTuple(schema, bytes, 0);
     assertEquals(bytes.length, tuple.size());

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 e5d8464..9f0764d 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,7 +19,7 @@
 package org.apache.tajo.storage;
 
 import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.SchemaFactory;
+import org.apache.tajo.catalog.SchemaBuilder;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.*;
@@ -45,12 +45,13 @@ public class TestTupleComparator {
 
   @Test
   public final void testCompare() {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.INT4);
-    schema.addColumn("col2", Type.INT4);
-    schema.addColumn("col3", Type.INT4);
-    schema.addColumn("col4", Type.INT4);
-    schema.addColumn("col5", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.INT4)
+        .add("col2", Type.INT4)
+        .add("col3", Type.INT4)
+        .add("col4", Type.INT4)
+        .add("col5", Type.TEXT)
+        .build();
     
     VTuple tuple1 = new VTuple(
         new Datum[] {
@@ -78,9 +79,10 @@ public class TestTupleComparator {
 
   @Test
   public void testNullFirst() throws Exception {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .build();
 
     VTuple tuple1 = new VTuple(2);
     tuple1.put(0, new Int4Datum(1));
@@ -118,9 +120,10 @@ public class TestTupleComparator {
 
   @Test
   public void testNullLast() throws Exception {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .build();
 
     VTuple tuple1 = new VTuple(2);
     tuple1.put(0, new Int4Datum(1));

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 6713519..b607a33 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.util.KeyValueSet;
@@ -36,11 +36,12 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("c1", Type.TEXT);
-    schema.addColumn("c2", Type.TEXT);
-    schema.addColumn("c3", Type.TEXT);
-    schema.addColumn("c4", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("c1", Type.TEXT)
+        .add("c2", Type.TEXT)
+        .add("c3", Type.TEXT)
+        .add("c4", Type.TEXT)
+        .build();
 
     TableMeta tableMeta = new TableMeta("HBASE", keyValueSet);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 4bdb4f4..6e5c551 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.exception.NotImplementedException;
 import org.apache.tajo.exception.TajoRuntimeException;
@@ -64,7 +64,8 @@ public class ParquetScanner extends FileScanner {
     if (targets == null) {
       targets = schema.toArray();
     }
-    reader = new TajoParquetReader(conf, fragment.getPath(), schema, SchemaFactory.newV1(targets));
+    reader = new TajoParquetReader(conf, fragment.getPath(), schema,
+        SchemaBuilder.builder().addAll(targets).build());
     totalRowCount = reader.getTotalRowCount();
     currentRowCount = 0;
     closed = false;

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 b2f3f34..0719699 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,7 +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.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes;
 
 import java.util.ArrayList;
@@ -65,7 +65,7 @@ public class TajoSchemaConverter {
     }
     Column[] columnsArray = new Column[columns.size()];
     columnsArray = columns.toArray(columnsArray);
-    return SchemaFactory.newV1(columnsArray);
+    return SchemaBuilder.builder().addAll(columnsArray).build();
   }
 
   private Column convertField(final Type fieldType) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 df9a7c7..4cfd19d 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
@@ -26,13 +26,10 @@ import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hive.common.io.DiskRange;
 import org.apache.hadoop.hive.common.io.DiskRangeList;
 import org.apache.orc.*;
-import org.apache.orc.OrcProto;
 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.catalog.SchemaBuilder;
 import org.apache.tajo.storage.Tuple;
 import org.apache.tajo.storage.VTuple;
 import org.apache.tajo.storage.fragment.FileFragment;
@@ -73,7 +70,7 @@ public class OrcRecordReader implements Closeable {
   public OrcRecordReader(List<StripeInformation> stripes,
                          FileSystem fileSystem,
                          Schema schema,
-                         Column[] target,
+                         Column[] targets,
                          FileFragment fragment,
                          List<OrcProto.Type> types,
                          CompressionCodec codec,
@@ -83,7 +80,7 @@ public class OrcRecordReader implements Closeable {
                          Configuration conf,
                          TimeZone timeZone) throws IOException {
 
-    result = new VTuple(target.length);
+    result = new VTuple(targets.length);
 
     this.conf = conf;
     this.path = fragment.getPath();
@@ -91,8 +88,8 @@ public class OrcRecordReader implements Closeable {
     this.types = types;
     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 = SchemaFactory.newV1(target);
+    included[0] = targets.length > 0; // always include root column except when target schema size is 0
+    Schema targetSchema = SchemaBuilder.builder().addAll(targets).build();
     for (int i = 1; i < included.length; i++) {
       included[i] = targetSchema.contains(schema.getColumn(i - 1));
     }
@@ -120,9 +117,9 @@ public class OrcRecordReader implements Closeable {
     firstRow = skippedRows;
     totalRowCount = rows;
 
-    reader = new DatumTreeReader[target.length];
+    reader = new DatumTreeReader[targets.length];
     for (int i = 0; i < reader.length; i++) {
-      reader[i] = TreeReaderFactory.createTreeReader(timeZone, schema.getColumnId(target[i].getQualifiedName()), target[i],
+      reader[i] = TreeReaderFactory.createTreeReader(timeZone, schema.getColumnId(targets[i].getQualifiedName()), targets[i],
           options.getSkipCorruptRecords());
     }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 d18961f..f1f1320 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -113,10 +113,11 @@ public class TestCompressionStorages {
   }
 
   private void storageCompressionTest(String dataFormat, Class<? extends CompressionCodec> codec) throws IOException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("age", Type.FLOAT4);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("age", Type.FLOAT4)
+        .add("name", Type.TEXT)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
     meta.putProperty("compression.codec", codec.getCanonicalName());

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 523a0d0..29d8197 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
@@ -42,21 +42,23 @@ import static org.junit.Assert.*;
 public class TestDelimitedTextFile {
   private static final Log LOG = LogFactory.getLog(TestDelimitedTextFile.class);
 
-  private static Schema schema = SchemaFactory.newV1();
+  private static Schema schema;
 
   private static Tuple baseTuple;
 
   static {
-    schema.addColumn("col1", Type.BOOLEAN);
-    schema.addColumn("col2", Type.CHAR, 7);
-    schema.addColumn("col3", Type.INT2);
-    schema.addColumn("col4", Type.INT4);
-    schema.addColumn("col5", Type.INT8);
-    schema.addColumn("col6", Type.FLOAT4);
-    schema.addColumn("col7", Type.FLOAT8);
-    schema.addColumn("col8", Type.TEXT);
-    schema.addColumn("col9", Type.BLOB);
-    schema.addColumn("col10", Type.INET4);
+    schema = SchemaBuilder.builder()
+        .add("col1", Type.BOOLEAN)
+        .add("col2", CatalogUtil.newDataTypeWithLen(Type.CHAR, 7))
+        .add("col3", Type.INT2)
+        .add("col4", Type.INT4)
+        .add("col5", Type.INT8)
+        .add("col6", Type.FLOAT4)
+        .add("col7", Type.FLOAT8)
+        .add("col8", Type.TEXT)
+        .add("col9", Type.BLOB)
+        .add("col10", Type.INET4)
+        .build();
 
     baseTuple = new VTuple(new Datum[] {
         DatumFactory.createBool(true),                // 0

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 59ff6f6..48740fb 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
@@ -98,10 +98,11 @@ public class TestFileSystems {
   @Test
   public void testBlockSplit() throws IOException {
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("age", Type.INT4);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("age", Type.INT4)
+        .add("name", Type.TEXT)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta("TEXT");
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 b8f9893..65453dd 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
@@ -82,10 +82,11 @@ public class TestFileTablespace {
 
   @Test
 	public final void testGetScannerAndAppender() throws IOException {
-		Schema schema = SchemaFactory.newV1();
-		schema.addColumn("id", Type.INT4);
-		schema.addColumn("age",Type.INT4);
-		schema.addColumn("name",Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("age", Type.INT4)
+        .add("name", Type.TEXT)
+        .build();
 
 		TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT);
 		
@@ -145,10 +146,11 @@ public class TestFileTablespace {
       TablespaceManager.addTableSpaceForTest(space);
       assertEquals(fs.getUri(), space.getUri());
 
-      Schema schema = SchemaFactory.newV1();
-      schema.addColumn("id", Type.INT4);
-      schema.addColumn("age",Type.INT4);
-      schema.addColumn("name",Type.TEXT);
+      Schema schema = SchemaBuilder.builder()
+          .add("id", Type.INT4)
+          .add("age", Type.INT4)
+          .add("name", Type.TEXT)
+          .build();
       TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT);
 
       List<Fragment> splits = Lists.newArrayList();
@@ -199,10 +201,11 @@ public class TestFileTablespace {
       TablespaceManager.addTableSpaceForTest(space);
       assertEquals(fs.getUri(), space.getUri());
 
-      Schema schema = SchemaFactory.newV1();
-      schema.addColumn("id", Type.INT4);
-      schema.addColumn("age",Type.INT4);
-      schema.addColumn("name",Type.TEXT);
+      Schema schema = SchemaBuilder.builder()
+          .add("id", Type.INT4)
+          .add("age", Type.INT4)
+          .add("name", Type.TEXT)
+          .build();
       TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT);
 
       List<Fragment> splits = Lists.newArrayList();
@@ -242,10 +245,11 @@ public class TestFileTablespace {
       TablespaceManager.addTableSpaceForTest(sm);
       assertEquals(fs.getUri(), sm.getUri());
 
-      Schema schema = SchemaFactory.newV1();
-      schema.addColumn("id", Type.INT4);
-      schema.addColumn("age", Type.INT4);
-      schema.addColumn("name", Type.TEXT);
+      Schema schema = SchemaBuilder.builder()
+          .add("id", Type.INT4)
+          .add("age", Type.INT4)
+          .add("name", Type.TEXT)
+          .build();
       TableMeta meta = CatalogUtil.newTableMeta(BuiltinStorages.TEXT);
 
       List<Fragment> splits = Lists.newArrayList();

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 e47741c..b72c98a 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
@@ -59,11 +59,12 @@ public class TestLineReader {
     Path testDir = CommonTestingUtil.getTestDir(TEST_PATH);
     FileSystem fs = testDir.getFileSystem(conf);
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("age", Type.INT8);
-    schema.addColumn("comment", Type.TEXT);
-    schema.addColumn("comment2", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("age", Type.INT8)
+        .add("comment", Type.TEXT)
+        .add("comment2", Type.TEXT)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta("TEXT");
     Path tablePath = new Path(testDir, "line.data");
@@ -111,11 +112,12 @@ public class TestLineReader {
     Path testDir = CommonTestingUtil.getTestDir(TEST_PATH);
     FileSystem fs = testDir.getFileSystem(conf);
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("age", Type.INT8);
-    schema.addColumn("comment", Type.TEXT);
-    schema.addColumn("comment2", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("age", Type.INT8)
+        .add("comment", Type.TEXT)
+        .add("comment2", Type.TEXT)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta("TEXT");
     meta.putProperty("compression.codec", DeflateCodec.class.getCanonicalName());
@@ -170,11 +172,12 @@ public class TestLineReader {
     Path testDir = CommonTestingUtil.getTestDir(TEST_PATH);
     FileSystem fs = testDir.getFileSystem(conf);
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("age", Type.INT8);
-    schema.addColumn("comment", Type.TEXT);
-    schema.addColumn("comment2", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("age", Type.INT8)
+        .add("comment", Type.TEXT)
+        .add("comment2", Type.TEXT)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta("TEXT");
 
@@ -276,11 +279,12 @@ public class TestLineReader {
     Path testDir = CommonTestingUtil.getTestDir(TEST_PATH);
     FileSystem fs = testDir.getFileSystem(conf);
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("age", Type.INT8);
-    schema.addColumn("comment", Type.TEXT);
-    schema.addColumn("comment2", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("age", Type.INT8)
+        .add("comment", Type.TEXT)
+        .add("comment2", Type.TEXT)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta("TEXT");
     Path tablePath = new Path(testDir, "testSeekableByteBufLineReader.data");

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 a04867e..ef264e9 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -99,11 +99,12 @@ public class TestMergeScanner {
 
   @Test
   public void testMultipleFiles() throws IOException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("file", Type.TEXT);
-    schema.addColumn("name", Type.TEXT);
-    schema.addColumn("age", Type.INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("file", Type.TEXT)
+        .add("name", Type.TEXT)
+        .add("age", Type.INT8)
+        .build();
 
     KeyValueSet options = new KeyValueSet();
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
@@ -161,9 +162,10 @@ public class TestMergeScanner {
     fragment[0] = new FileFragment("tablet1", table1Path, 0, status1.getLen());
     fragment[1] = new FileFragment("tablet1", table2Path, 0, status2.getLen());
 
-    Schema targetSchema = SchemaFactory.newV1();
-    targetSchema.addColumn(schema.getColumn(0));
-    targetSchema.addColumn(schema.getColumn(2));
+    Schema targetSchema = SchemaBuilder.builder()
+        .add(schema.getColumn(0))
+        .add(schema.getColumn(2))
+        .build();
 
     Scanner scanner = new MergeScanner(conf, schema, meta, Arrays.asList(fragment), targetSchema);
     assertEquals(isProjectableStorage(meta.getDataFormat()), scanner.isProjectable());

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 2e88398..eb07034 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -186,9 +186,10 @@ public class TestStorages {
   @Test
   public void testSplitable() throws IOException {
     if (splitable) {
-      Schema schema = SchemaFactory.newV1();
-      schema.addColumn("id", Type.INT4);
-      schema.addColumn("age", Type.INT8);
+      Schema schema = SchemaBuilder.builder()
+          .add("id", Type.INT4)
+          .add("age", Type.INT8)
+          .build();
 
       TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
       Path tablePath = new Path(testDir, "Splitable.data");
@@ -240,10 +241,11 @@ public class TestStorages {
 
   @Test
   public void testZeroRows() throws IOException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("age", Type.INT8);
-    schema.addColumn("score", Type.FLOAT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("age", Type.INT8)
+        .add("score", Type.FLOAT4)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
     meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
@@ -284,9 +286,10 @@ public class TestStorages {
   @Test
   public void testRCFileSplitable() throws IOException {
     if (dataFormat.equalsIgnoreCase(BuiltinStorages.RCFILE)) {
-      Schema schema = SchemaFactory.newV1();
-      schema.addColumn("id", Type.INT4);
-      schema.addColumn("age", Type.INT8);
+      Schema schema = SchemaBuilder.builder()
+          .add("id", Type.INT4)
+          .add("age", Type.INT8)
+          .build();
 
       TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
       Path tablePath = new Path(testDir, "Splitable.data");
@@ -338,10 +341,11 @@ public class TestStorages {
 
   @Test
   public void testProjection() throws IOException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("age", Type.INT8);
-    schema.addColumn("score", Type.FLOAT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("age", Type.INT8)
+        .add("score", Type.FLOAT4)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
     meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
@@ -369,9 +373,10 @@ public class TestStorages {
     FileStatus status = fs.getFileStatus(tablePath);
     FileFragment fragment = new FileFragment("testReadAndWrite", tablePath, 0, status.getLen());
 
-    Schema target = SchemaFactory.newV1();
-    target.addColumn("age", Type.INT8);
-    target.addColumn("score", Type.FLOAT4);
+    Schema target = SchemaBuilder.builder()
+        .add("age", Type.INT8)
+        .add("score", Type.FLOAT4)
+        .build();
     Scanner scanner = sm.getScanner(meta, schema, fragment, target);
     scanner.init();
     int tupleCnt = 0;
@@ -401,21 +406,23 @@ public class TestStorages {
 
   @Test
   public void testVariousTypes() throws IOException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.BOOLEAN);
-    schema.addColumn("col2", Type.CHAR, 7);
-    schema.addColumn("col3", Type.INT2);
-    schema.addColumn("col4", Type.INT4);
-    schema.addColumn("col5", Type.INT8);
-    schema.addColumn("col6", Type.FLOAT4);
-    schema.addColumn("col7", Type.FLOAT8);
-    schema.addColumn("col8", Type.TEXT);
-    schema.addColumn("col9", Type.BLOB);
-    schema.addColumn("col10", Type.INET4);
+    SchemaBuilder schemaBld = SchemaBuilder.builder()
+        .add("col1", Type.BOOLEAN)
+        .add("col2", CatalogUtil.newDataTypeWithLen(Type.CHAR, 7))
+        .add("col3", Type.INT2)
+        .add("col4", Type.INT4)
+        .add("col5", Type.INT8)
+        .add("col6", Type.FLOAT4)
+        .add("col7", Type.FLOAT8)
+        .add("col8", Type.TEXT)
+        .add("col9", Type.BLOB)
+        .add("col10", Type.INET4);
     if (protoTypeSupport()) {
-      schema.addColumn("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()));
+      schemaBld.add("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()));
     }
 
+    Schema schema = schemaBld.build();
+
     KeyValueSet options = new KeyValueSet();
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
     meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
@@ -470,22 +477,24 @@ public class TestStorages {
 
   @Test
   public void testNullHandlingTypes() throws IOException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.BOOLEAN);
-    schema.addColumn("col2", Type.CHAR, 7);
-    schema.addColumn("col3", Type.INT2);
-    schema.addColumn("col4", Type.INT4);
-    schema.addColumn("col5", Type.INT8);
-    schema.addColumn("col6", Type.FLOAT4);
-    schema.addColumn("col7", Type.FLOAT8);
-    schema.addColumn("col8", Type.TEXT);
-    schema.addColumn("col9", Type.BLOB);
-    schema.addColumn("col10", Type.INET4);
+    SchemaBuilder schemaBld = SchemaBuilder.builder()
+        .add("col1", Type.BOOLEAN)
+        .add("col2", CatalogUtil.newDataTypeWithLen(Type.CHAR, 7))
+        .add("col3", Type.INT2)
+        .add("col4", Type.INT4)
+        .add("col5", Type.INT8)
+        .add("col6", Type.FLOAT4)
+        .add("col7", Type.FLOAT8)
+        .add("col8", Type.TEXT)
+        .add("col9", Type.BLOB)
+        .add("col10", Type.INET4);
 
     if (protoTypeSupport()) {
-      schema.addColumn("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()));
+      schemaBld.add("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()));
     }
 
+    Schema schema = schemaBld.build();
+
     KeyValueSet options = new KeyValueSet();
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
     meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
@@ -565,22 +574,24 @@ public class TestStorages {
   public void testNullHandlingTypesWithProjection() throws IOException {
     if (internalType) return;
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.BOOLEAN);
-    schema.addColumn("col2", Type.CHAR, 7);
-    schema.addColumn("col3", Type.INT2);
-    schema.addColumn("col4", Type.INT4);
-    schema.addColumn("col5", Type.INT8);
-    schema.addColumn("col6", Type.FLOAT4);
-    schema.addColumn("col7", Type.FLOAT8);
-    schema.addColumn("col8", Type.TEXT);
-    schema.addColumn("col9", Type.BLOB);
-    schema.addColumn("col10", Type.INET4);
+    SchemaBuilder schemaBld = SchemaBuilder.builder()
+    .add("col1", Type.BOOLEAN)
+    .add("col2", CatalogUtil.newDataTypeWithLen(Type.CHAR, 7))
+    .add("col3", Type.INT2)
+    .add("col4", Type.INT4)
+    .add("col5", Type.INT8)
+    .add("col6", Type.FLOAT4)
+    .add("col7", Type.FLOAT8)
+    .add("col8", Type.TEXT)
+    .add("col9", Type.BLOB)
+    .add("col10", Type.INET4);
 
     if (protoTypeSupport()) {
-      schema.addColumn("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()));
+      schemaBld.add("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()));
     }
 
+    Schema schema = schemaBld.build();
+
     KeyValueSet options = new KeyValueSet();
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
     meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
@@ -636,14 +647,15 @@ public class TestStorages {
 
 
     // Making projection schema with different column positions
-    Schema target = SchemaFactory.newV1();
+    SchemaBuilder targetBld = SchemaBuilder.builder();
     Random random = new Random();
     for (int i = 1; i < schema.size(); i++) {
       int num = random.nextInt(schema.size() - 1) + 1;
       if (i % num == 0) {
-        target.addColumn(schema.getColumn(i));
+        targetBld.add(schema.getColumn(i));
       }
     }
+    Schema target = targetBld.build();
 
     FileStatus status = fs.getFileStatus(tablePath);
     FileFragment fragment = new FileFragment("table", tablePath, 0, status.getLen());
@@ -671,19 +683,19 @@ public class TestStorages {
   public void testRCFileTextSerializeDeserialize() throws IOException {
     if(!dataFormat.equalsIgnoreCase(BuiltinStorages.RCFILE)) return;
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.BOOLEAN);
-    schema.addColumn("col2", Type.BIT);
-    schema.addColumn("col3", Type.CHAR, 7);
-    schema.addColumn("col4", Type.INT2);
-    schema.addColumn("col5", Type.INT4);
-    schema.addColumn("col6", Type.INT8);
-    schema.addColumn("col7", Type.FLOAT4);
-    schema.addColumn("col8", Type.FLOAT8);
-    schema.addColumn("col9", Type.TEXT);
-    schema.addColumn("col10", Type.BLOB);
-    schema.addColumn("col11", Type.INET4);
-    schema.addColumn("col12", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()));
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.BOOLEAN)
+        .add("col2", CatalogUtil.newDataTypeWithLen(Type.CHAR, 7))
+        .add("col3", Type.INT2)
+        .add("col4", Type.INT4)
+        .add("col5", Type.INT8)
+        .add("col6", Type.FLOAT4)
+        .add("col7", Type.FLOAT8)
+        .add("col8", Type.TEXT)
+        .add("col9", Type.BLOB)
+        .add("col10", Type.INET4)
+        .add("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()))
+        .build();
 
     KeyValueSet options = new KeyValueSet();
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
@@ -700,7 +712,6 @@ public class TestStorages {
 
     VTuple tuple = new VTuple(new Datum[] {
         DatumFactory.createBool(true),
-        DatumFactory.createBit((byte) 0x99),
         DatumFactory.createChar("jinho"),
         DatumFactory.createInt2((short) 17),
         DatumFactory.createInt4(59),
@@ -738,19 +749,19 @@ public class TestStorages {
   public void testRCFileBinarySerializeDeserialize() throws IOException {
     if(!dataFormat.equalsIgnoreCase(BuiltinStorages.RCFILE)) return;
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.BOOLEAN);
-    schema.addColumn("col2", Type.BIT);
-    schema.addColumn("col3", Type.CHAR, 7);
-    schema.addColumn("col4", Type.INT2);
-    schema.addColumn("col5", Type.INT4);
-    schema.addColumn("col6", Type.INT8);
-    schema.addColumn("col7", Type.FLOAT4);
-    schema.addColumn("col8", Type.FLOAT8);
-    schema.addColumn("col9", Type.TEXT);
-    schema.addColumn("col10", Type.BLOB);
-    schema.addColumn("col11", Type.INET4);
-    schema.addColumn("col12", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()));
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.BOOLEAN)
+        .add("col2", CatalogUtil.newDataTypeWithLen(Type.CHAR, 7))
+        .add("col3", Type.INT2)
+        .add("col4", Type.INT4)
+        .add("col5", Type.INT8)
+        .add("col6", Type.FLOAT4)
+        .add("col7", Type.FLOAT8)
+        .add("col8", Type.TEXT)
+        .add("col9", Type.BLOB)
+        .add("col10", Type.INET4)
+        .add("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()))
+        .build();
 
     KeyValueSet options = new KeyValueSet();
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
@@ -767,7 +778,6 @@ public class TestStorages {
 
     VTuple tuple = new VTuple(new Datum[] {
         DatumFactory.createBool(true),
-        DatumFactory.createBit((byte) 0x99),
         DatumFactory.createChar("jinho"),
         DatumFactory.createInt2((short) 17),
         DatumFactory.createInt4(59),
@@ -805,19 +815,18 @@ public class TestStorages {
   public void testSequenceFileTextSerializeDeserialize() throws IOException {
     if(!dataFormat.equalsIgnoreCase(BuiltinStorages.SEQUENCE_FILE)) return;
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.BOOLEAN);
-    schema.addColumn("col2", Type.BIT);
-    schema.addColumn("col3", Type.CHAR, 7);
-    schema.addColumn("col4", Type.INT2);
-    schema.addColumn("col5", Type.INT4);
-    schema.addColumn("col6", Type.INT8);
-    schema.addColumn("col7", Type.FLOAT4);
-    schema.addColumn("col8", Type.FLOAT8);
-    schema.addColumn("col9", Type.TEXT);
-    schema.addColumn("col10", Type.BLOB);
-    schema.addColumn("col11", Type.INET4);
-    schema.addColumn("col12", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()));
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.BOOLEAN)
+        .add("col2", CatalogUtil.newDataTypeWithLen(Type.CHAR, 7))
+        .add("col3", Type.INT2)
+        .add("col4", Type.INT4)
+        .add("col5", Type.INT8)
+        .add("col6", Type.FLOAT4)
+        .add("col7", Type.FLOAT8)
+        .add("col8", Type.TEXT)
+        .add("col9", Type.BLOB)
+        .add("col10", Type.INET4)
+        .add("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName())).build();
 
     KeyValueSet options = new KeyValueSet();
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
@@ -833,7 +842,6 @@ public class TestStorages {
 
     VTuple tuple = new VTuple(new Datum[] {
         DatumFactory.createBool(true),
-        DatumFactory.createBit((byte) 0x99),
         DatumFactory.createChar("jinho"),
         DatumFactory.createInt2((short) 17),
         DatumFactory.createInt4(59),
@@ -875,19 +883,19 @@ public class TestStorages {
   public void testSequenceFileBinarySerializeDeserialize() throws IOException {
     if(!dataFormat.equalsIgnoreCase(BuiltinStorages.SEQUENCE_FILE)) return;
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.BOOLEAN);
-    schema.addColumn("col2", Type.BIT);
-    schema.addColumn("col3", Type.CHAR, 7);
-    schema.addColumn("col4", Type.INT2);
-    schema.addColumn("col5", Type.INT4);
-    schema.addColumn("col6", Type.INT8);
-    schema.addColumn("col7", Type.FLOAT4);
-    schema.addColumn("col8", Type.FLOAT8);
-    schema.addColumn("col9", Type.TEXT);
-    schema.addColumn("col10", Type.BLOB);
-    schema.addColumn("col11", Type.INET4);
-    schema.addColumn("col12", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()));
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.BOOLEAN)
+        .add("col2", CatalogUtil.newDataTypeWithLen(Type.CHAR, 7))
+        .add("col3", Type.INT2)
+        .add("col4", Type.INT4)
+        .add("col5", Type.INT8)
+        .add("col6", Type.FLOAT4)
+        .add("col7", Type.FLOAT8)
+        .add("col8", Type.TEXT)
+        .add("col9", Type.BLOB)
+        .add("col10", Type.INET4)
+        .add("col11", CatalogUtil.newDataType(Type.PROTOBUF, TajoIdProtos.QueryIdProto.class.getName()))
+        .build();
 
     KeyValueSet options = new KeyValueSet();
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
@@ -903,7 +911,6 @@ public class TestStorages {
 
     VTuple tuple = new VTuple(new Datum[] {
         DatumFactory.createBool(true),
-        DatumFactory.createBit((byte) 0x99),
         DatumFactory.createChar("jinho"),
         DatumFactory.createInt2((short) 17),
         DatumFactory.createInt4(59),
@@ -946,13 +953,13 @@ public class TestStorages {
     if (dateTypeSupport() || timeTypeSupport()) {
 
       int index = 2;
-      Schema schema = SchemaFactory.newV1();
-      schema.addColumn("col1", Type.TIMESTAMP);
+      SchemaBuilder schema = SchemaBuilder.builder()
+      .add("col1", Type.TIMESTAMP);
       if (dateTypeSupport()) {
-        schema.addColumn("col" + index++, Type.DATE);
+        schema.add("col" + index++, Type.DATE);
       }
       if (timeTypeSupport()) {
-        schema.addColumn("col" + index++, Type.TIME);
+        schema.add("col" + index++, Type.TIME);
       }
 
       KeyValueSet options = new KeyValueSet();
@@ -960,7 +967,7 @@ public class TestStorages {
 
       Path tablePath = new Path(testDir, "testTime.data");
       FileTablespace sm = TablespaceManager.getLocalFs();
-      Appender appender = sm.getAppender(meta, schema, tablePath);
+      Appender appender = sm.getAppender(meta, schema.build(), tablePath);
       appender.init();
 
       VTuple tuple = new VTuple(index - 1);
@@ -978,7 +985,7 @@ public class TestStorages {
 
       FileStatus status = fs.getFileStatus(tablePath);
       FileFragment fragment = new FileFragment("table", tablePath, 0, status.getLen());
-      Scanner scanner = TablespaceManager.getLocalFs().getScanner(meta, schema, fragment, null);
+      Scanner scanner = TablespaceManager.getLocalFs().getScanner(meta, schema.build(), fragment, null);
       scanner.init();
 
       Tuple retrieved;
@@ -997,10 +1004,11 @@ public class TestStorages {
       return;
     }
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("age", Type.INT8);
-    schema.addColumn("comment", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("age", Type.INT8)
+        .add("comment", Type.TEXT)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
     Path tablePath = new Path(testDir, "Seekable.data");
@@ -1072,12 +1080,13 @@ public class TestStorages {
   @Test
   public void testMaxValue() throws IOException {
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.FLOAT4);
-    schema.addColumn("col2", Type.FLOAT8);
-    schema.addColumn("col3", Type.INT2);
-    schema.addColumn("col4", Type.INT4);
-    schema.addColumn("col5", Type.INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.FLOAT4)
+        .add("col2", Type.FLOAT8)
+        .add("col3", Type.INT2)
+        .add("col4", Type.INT4)
+        .add("col5", Type.INT8)
+        .build();
 
     KeyValueSet options = new KeyValueSet();
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
@@ -1139,10 +1148,11 @@ public class TestStorages {
       return;
     }
 
-    Schema dataSchema = SchemaFactory.newV1();
-    dataSchema.addColumn("col1", Type.FLOAT4);
-    dataSchema.addColumn("col2", Type.FLOAT8);
-    dataSchema.addColumn("col3", Type.INT2);
+    Schema dataSchema = SchemaBuilder.builder()
+        .add("col1", Type.FLOAT4)
+        .add("col2", Type.FLOAT8)
+        .add("col3", Type.INT2)
+        .build();
 
     KeyValueSet options = new KeyValueSet();
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
@@ -1167,20 +1177,21 @@ public class TestStorages {
 
     assertTrue(fs.exists(tablePath));
     FileStatus status = fs.getFileStatus(tablePath);
-    Schema inSchema = SchemaFactory.newV1();
-    inSchema.addColumn("col1", Type.FLOAT4);
-    inSchema.addColumn("col2", Type.FLOAT8);
-    inSchema.addColumn("col3", Type.INT2);
-    inSchema.addColumn("col4", Type.INT4);
-    inSchema.addColumn("col5", Type.INT8);
+    Schema inSchema = SchemaBuilder.builder()
+        .add("col1", Type.FLOAT4)
+        .add("col2", Type.FLOAT8)
+        .add("col3", Type.INT2)
+        .add("col4", Type.INT4)
+        .add("col5", Type.INT8)
+        .build();
 
     FileFragment fragment = new FileFragment("table", tablePath, 0, status.getLen());
     Scanner scanner = TablespaceManager.getLocalFs().getScanner(meta, inSchema, fragment, null);
 
-    Schema target = SchemaFactory.newV1();
-
-    target.addColumn("col2", Type.FLOAT8);
-    target.addColumn("col5", Type.INT8);
+    Schema target = SchemaBuilder.builder()
+        .add("col2", Type.FLOAT8)
+        .add("col5", Type.INT8)
+        .build();
     scanner.setTarget(target.toArray());
     scanner.init();
 
@@ -1205,8 +1216,9 @@ public class TestStorages {
       return;
     }
 
-    Schema dataSchema = SchemaFactory.newV1();
-    dataSchema.addColumn("col1", Type.CHAR);
+    Schema dataSchema = SchemaBuilder.builder()
+        .add("col1", Type.CHAR)
+        .build();
 
     KeyValueSet options = new KeyValueSet();
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
@@ -1248,8 +1260,7 @@ public class TestStorages {
       return;
     }
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.TEXT);
+    Schema schema = SchemaBuilder.builder().add("col1", Type.TEXT).build();
 
     KeyValueSet options = new KeyValueSet();
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
@@ -1289,10 +1300,11 @@ public class TestStorages {
 
     if (internalType) return;
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("age", Type.INT8);
-    schema.addColumn("score", Type.FLOAT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("age", Type.INT8)
+        .add("score", Type.FLOAT4)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
     meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
@@ -1324,12 +1336,13 @@ public class TestStorages {
   @Test
   public void testProgress() throws IOException {
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.FLOAT4);
-    schema.addColumn("col2", Type.FLOAT8);
-    schema.addColumn("col3", Type.INT2);
-    schema.addColumn("col4", Type.INT4);
-    schema.addColumn("col5", Type.INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.FLOAT4)
+        .add("col2", Type.FLOAT8)
+        .add("col3", Type.INT2)
+        .add("col4", Type.INT4)
+        .add("col5", Type.INT8)
+        .build();
 
     KeyValueSet options = new KeyValueSet();
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat, options);
@@ -1372,10 +1385,11 @@ public class TestStorages {
   public void testEmptySchema() throws IOException {
     if (internalType) return;
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("age", Type.INT8);
-    schema.addColumn("score", Type.FLOAT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("age", Type.INT8)
+        .add("score", Type.FLOAT4)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta(dataFormat);
     meta.setPropertySet(CatalogUtil.newDefaultProperty(dataFormat));
@@ -1410,7 +1424,7 @@ public class TestStorages {
     }
 
     //e,g select count(*) from table
-    Schema target = SchemaFactory.newV1();
+    Schema target = SchemaBuilder.builder().build();
     assertEquals(0, target.size());
 
     FileFragment fragment = new FileFragment("table", tablePath, 0, status.getLen());

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 18d5012..1eb28b6 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,12 +60,13 @@ public class TestBSTIndex {
     this.dataFormat = type;
     conf = new TajoConf();
     conf.setVar(TajoConf.ConfVars.ROOT_DIR, TEST_PATH);
-    schema = SchemaFactory.newV1();
-    schema.addColumn(new Column("int", Type.INT4));
-    schema.addColumn(new Column("long", Type.INT8));
-    schema.addColumn(new Column("double", Type.FLOAT8));
-    schema.addColumn(new Column("float", Type.FLOAT4));
-    schema.addColumn(new Column("string", Type.TEXT));
+    schema = SchemaBuilder.builder()
+        .add(new Column("int", Type.INT4))
+        .add(new Column("long", Type.INT8))
+        .add(new Column("double", Type.FLOAT8))
+        .add(new Column("float", Type.FLOAT4))
+        .add(new Column("string", Type.TEXT))
+        .build();
   }
 
 
@@ -111,9 +112,10 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), true, false);
 
-    Schema keySchema = SchemaFactory.newV1();
-    keySchema.addColumn(new Column("long", Type.INT8));
-    keySchema.addColumn(new Column("double", Type.FLOAT8));
+    Schema keySchema = SchemaBuilder.builder()
+        .add(new Column("long", Type.INT8))
+        .add(new Column("double", Type.FLOAT8))
+        .build();
 
     BaseTupleComparator comp = new BaseTupleComparator(keySchema, sortKeys);
 
@@ -187,9 +189,10 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), true, false);
 
-    Schema keySchema = SchemaFactory.newV1();
-    keySchema.addColumn(new Column("long", Type.INT8));
-    keySchema.addColumn(new Column("double", Type.FLOAT8));
+    Schema keySchema = SchemaBuilder.builder()
+        .add(new Column("long", Type.INT8))
+        .add(new Column("double", Type.FLOAT8))
+        .build();
 
     BaseTupleComparator comp = new BaseTupleComparator(keySchema, sortKeys);
 
@@ -280,9 +283,10 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), true, false);
 
-    Schema keySchema = SchemaFactory.newV1();
-    keySchema.addColumn(new Column("long", Type.INT8));
-    keySchema.addColumn(new Column("double", Type.FLOAT8));
+    Schema keySchema = SchemaBuilder.builder()
+        .add(new Column("long", Type.INT8))
+        .add(new Column("double", Type.FLOAT8))
+        .build();
 
     BaseTupleComparator comp = new BaseTupleComparator(keySchema, sortKeys);
 
@@ -353,9 +357,10 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("int"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("long"), true, false);
 
-    Schema keySchema = SchemaFactory.newV1();
-    keySchema.addColumn(new Column("int", Type.INT4));
-    keySchema.addColumn(new Column("long", Type.INT8));
+    Schema keySchema = SchemaBuilder.builder()
+        .add(new Column("int", Type.INT4))
+        .add(new Column("long", Type.INT8))
+        .build();
 
     BaseTupleComparator comp = new BaseTupleComparator(keySchema, sortKeys);
 
@@ -446,9 +451,10 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("int"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("long"), true, false);
 
-    Schema keySchema = SchemaFactory.newV1();
-    keySchema.addColumn(new Column("int", Type.INT4));
-    keySchema.addColumn(new Column("long", Type.INT8));
+    Schema keySchema = SchemaBuilder.builder()
+        .add(new Column("int", Type.INT4))
+        .add(new Column("long", Type.INT8))
+        .build();
 
     BaseTupleComparator comp = new BaseTupleComparator(keySchema, sortKeys);
 
@@ -529,9 +535,10 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), true, false);
 
-    Schema keySchema = SchemaFactory.newV1();
-    keySchema.addColumn(new Column("long", Type.INT8));
-    keySchema.addColumn(new Column("double", Type.FLOAT8));
+    Schema keySchema = SchemaBuilder.builder()
+        .add(new Column("long", Type.INT8))
+        .add(new Column("double", Type.FLOAT8))
+        .build();
 
     BaseTupleComparator comp = new BaseTupleComparator(keySchema, sortKeys);
     BSTIndex bst = new BSTIndex(conf);
@@ -614,9 +621,10 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("int"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("long"), true, false);
 
-    Schema keySchema = SchemaFactory.newV1();
-    keySchema.addColumn(new Column("int", Type.INT4));
-    keySchema.addColumn(new Column("long", Type.INT8));
+    Schema keySchema = SchemaBuilder.builder()
+        .add(new Column("int", Type.INT4))
+        .add(new Column("long", Type.INT8))
+        .build();
 
     BaseTupleComparator comp = new BaseTupleComparator(keySchema, sortKeys);
 
@@ -721,9 +729,10 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("int"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("long"), true, false);
 
-    Schema keySchema = SchemaFactory.newV1();
-    keySchema.addColumn(new Column("int", Type.INT4));
-    keySchema.addColumn(new Column("long", Type.INT8));
+    Schema keySchema = SchemaBuilder.builder()
+        .add(new Column("int", Type.INT4))
+        .add(new Column("long", Type.INT8))
+        .build();
 
     BaseTupleComparator comp = new BaseTupleComparator(keySchema, sortKeys);
 
@@ -803,9 +812,10 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), false, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), false, false);
 
-    Schema keySchema = SchemaFactory.newV1();
-    keySchema.addColumn(new Column("long", Type.INT8));
-    keySchema.addColumn(new Column("double", Type.FLOAT8));
+    Schema keySchema = SchemaBuilder.builder()
+        .add(new Column("long", Type.INT8))
+        .add(new Column("double", Type.FLOAT8))
+        .build();
 
     BaseTupleComparator comp = new BaseTupleComparator(keySchema, sortKeys);
 
@@ -896,9 +906,10 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("int"), false, false);
     sortKeys[1] = new SortSpec(schema.getColumn("long"), false, false);
 
-    Schema keySchema = SchemaFactory.newV1();
-    keySchema.addColumn(new Column("int", Type.INT4));
-    keySchema.addColumn(new Column("long", Type.INT8));
+    Schema keySchema = SchemaBuilder.builder()
+        .add(new Column("int", Type.INT4))
+        .add(new Column("long", Type.INT8))
+        .build();
 
     BaseTupleComparator comp = new BaseTupleComparator(keySchema, sortKeys);
 
@@ -996,9 +1007,10 @@ public class TestBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), true, false);
 
-    Schema keySchema = SchemaFactory.newV1();
-    keySchema.addColumn(new Column("long", Type.INT8));
-    keySchema.addColumn(new Column("double", Type.FLOAT8));
+    Schema keySchema = SchemaBuilder.builder()
+        .add(new Column("long", Type.INT8))
+        .add(new Column("double", Type.FLOAT8))
+        .build();
 
     BaseTupleComparator comp = new BaseTupleComparator(keySchema, sortKeys);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 1053853..358be38 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,12 +56,13 @@ public class TestSingleCSVFileBSTIndex {
   public TestSingleCSVFileBSTIndex() {
     conf = new TajoConf();
     conf.setVar(ConfVars.ROOT_DIR, TEST_PATH);
-    schema = SchemaFactory.newV1();
-    schema.addColumn(new Column("int", Type.INT4));
-    schema.addColumn(new Column("long", Type.INT8));
-    schema.addColumn(new Column("double", Type.FLOAT8));
-    schema.addColumn(new Column("float", Type.FLOAT4));
-    schema.addColumn(new Column("string", Type.TEXT));
+    schema = SchemaBuilder.builder()
+        .add(new Column("int", Type.INT4))
+        .add(new Column("long", Type.INT8))
+        .add(new Column("double", Type.FLOAT8))
+        .add(new Column("float", Type.FLOAT4))
+        .add(new Column("string", Type.TEXT))
+        .build();
   }
 
   @Before
@@ -99,9 +100,10 @@ public class TestSingleCSVFileBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("long"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("double"), true, false);
 
-    Schema keySchema = SchemaFactory.newV1();
-    keySchema.addColumn(new Column("long", Type.INT8));
-    keySchema.addColumn(new Column("double", Type.FLOAT8));
+    Schema keySchema = SchemaBuilder.builder()
+        .add(new Column("long", Type.INT8))
+        .add(new Column("double", Type.FLOAT8))
+        .build();
 
     BaseTupleComparator comp = new BaseTupleComparator(keySchema, sortKeys);
 
@@ -190,9 +192,10 @@ public class TestSingleCSVFileBSTIndex {
     sortKeys[0] = new SortSpec(schema.getColumn("int"), true, false);
     sortKeys[1] = new SortSpec(schema.getColumn("long"), true, false);
 
-    Schema keySchema = SchemaFactory.newV1();
-    keySchema.addColumn(new Column("int", Type.INT4));
-    keySchema.addColumn(new Column("long", Type.INT8));
+    Schema keySchema = SchemaBuilder.builder()
+        .add(new Column("int", Type.INT4))
+        .add(new Column("long", Type.INT8))
+        .build();
 
     BaseTupleComparator comp = new BaseTupleComparator(keySchema, sortKeys);
     

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 c2ce9e7..30367c2 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,14 +23,17 @@ 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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.NullDatum;
-import org.apache.tajo.storage.*;
+import org.apache.tajo.storage.Scanner;
+import org.apache.tajo.storage.TablespaceManager;
+import org.apache.tajo.storage.Tuple;
+import org.apache.tajo.storage.VTuple;
 import org.apache.tajo.storage.fragment.FileFragment;
 import org.junit.Test;
 
@@ -40,20 +43,22 @@ import java.net.URL;
 import static org.junit.Assert.*;
 
 public class TestJsonSerDe {
-  private static Schema schema = SchemaFactory.newV1();
+  private static Schema schema;
 
   static {
-    schema.addColumn("col1", TajoDataTypes.Type.BOOLEAN);
-    schema.addColumn("col2", TajoDataTypes.Type.CHAR, 7);
-    schema.addColumn("col3", TajoDataTypes.Type.INT2);
-    schema.addColumn("col4", TajoDataTypes.Type.INT4);
-    schema.addColumn("col5", TajoDataTypes.Type.INT8);
-    schema.addColumn("col6", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col7", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col8", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col9", TajoDataTypes.Type.BLOB);
-    schema.addColumn("col10", TajoDataTypes.Type.INET4);
-    schema.addColumn("col11", TajoDataTypes.Type.NULL_TYPE);
+    schema = SchemaBuilder.builder()
+        .add("col1", TajoDataTypes.Type.BOOLEAN)
+        .add("col2", CatalogUtil.newDataTypeWithLen(TajoDataTypes.Type.CHAR, 7))
+        .add("col3", TajoDataTypes.Type.INT2)
+        .add("col4", TajoDataTypes.Type.INT4)
+        .add("col5", TajoDataTypes.Type.INT8)
+        .add("col6", TajoDataTypes.Type.FLOAT4)
+        .add("col7", TajoDataTypes.Type.FLOAT8)
+        .add("col8", TajoDataTypes.Type.TEXT)
+        .add("col9", TajoDataTypes.Type.BLOB)
+        .add("col10", TajoDataTypes.Type.INET4)
+        .add("col11", TajoDataTypes.Type.NULL_TYPE)
+        .build();
   }
 
   public static Path getResourcePath(String path, String suffix) {
@@ -105,10 +110,11 @@ public class TestJsonSerDe {
     FileStatus status = fs.getFileStatus(tablePath);
     FileFragment fragment = new FileFragment("table", tablePath, 0, status.getLen());
 
-    Schema  schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col2", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col3", TajoDataTypes.Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TajoDataTypes.Type.TEXT)
+        .add("col2", TajoDataTypes.Type.TEXT)
+        .add("col3", TajoDataTypes.Type.TEXT)
+        .build();
     Scanner scanner =  TablespaceManager.getLocalFs().getScanner(meta, schema, fragment, null);
     scanner.init();
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 b39bfce..eb6238b 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,7 +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.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.DatumFactory;
@@ -56,7 +56,6 @@ public class TestReadWrite {
   private Schema createAllTypesSchema() {
     List<Column> columns = new ArrayList<>();
     columns.add(new Column("myboolean", Type.BOOLEAN));
-    columns.add(new Column("mybit", Type.BIT));
     columns.add(new Column("mychar", Type.CHAR));
     columns.add(new Column("myint2", Type.INT2));
     columns.add(new Column("myint4", Type.INT4));
@@ -68,7 +67,7 @@ public class TestReadWrite {
     columns.add(new Column("mynull", Type.NULL_TYPE));
     Column[] columnsArray = new Column[columns.size()];
     columnsArray = columns.toArray(columnsArray);
-    return SchemaFactory.newV1(columnsArray);
+    return SchemaBuilder.builder().addAll(columnsArray).build();
   }
 
   @Test
@@ -77,16 +76,15 @@ public class TestReadWrite {
     Schema schema = createAllTypesSchema();
     Tuple tuple = new VTuple(schema.size());
     tuple.put(0, DatumFactory.createBool(true));
-    tuple.put(1, DatumFactory.createBit((byte)128));
-    tuple.put(2, DatumFactory.createChar('t'));
-    tuple.put(3, DatumFactory.createInt2((short)2048));
-    tuple.put(4, DatumFactory.createInt4(4096));
-    tuple.put(5, DatumFactory.createInt8(8192L));
-    tuple.put(6, DatumFactory.createFloat4(0.2f));
-    tuple.put(7, DatumFactory.createFloat8(4.1));
-    tuple.put(8, DatumFactory.createText(HELLO));
-    tuple.put(9, DatumFactory.createBlob(HELLO.getBytes(Charsets.UTF_8)));
-    tuple.put(10, NullDatum.get());
+    tuple.put(1, DatumFactory.createChar('t'));
+    tuple.put(2, DatumFactory.createInt2((short)2048));
+    tuple.put(3, DatumFactory.createInt4(4096));
+    tuple.put(4, DatumFactory.createInt8(8192L));
+    tuple.put(5, DatumFactory.createFloat4(0.2f));
+    tuple.put(6, DatumFactory.createFloat8(4.1));
+    tuple.put(7, DatumFactory.createText(HELLO));
+    tuple.put(8, DatumFactory.createBlob(HELLO.getBytes(Charsets.UTF_8)));
+    tuple.put(9, NullDatum.get());
 
     TajoParquetWriter writer = new TajoParquetWriter(file, schema);
     writer.write(tuple);
@@ -97,15 +95,14 @@ public class TestReadWrite {
 
     assertNotNull(tuple);
     assertEquals(true, tuple.getBool(0));
-    assertEquals((byte)128, tuple.getByte(1));
-    assertTrue(String.valueOf('t').equals(String.valueOf(tuple.getChar(2))));
-    assertEquals((short)2048, tuple.getInt2(3));
-    assertEquals(4096, tuple.getInt4(4));
-    assertEquals(8192L, tuple.getInt8(5));
-    assertEquals(new Float(0.2f), new Float(tuple.getFloat4(6)));
-    assertEquals(new Double(4.1), new Double(tuple.getFloat8(7)));
-    assertTrue(HELLO.equals(tuple.getText(8)));
-    assertArrayEquals(HELLO.getBytes(Charsets.UTF_8), tuple.getBytes(9));
-    assertTrue(tuple.isBlankOrNull(10));
+    assertTrue(String.valueOf('t').equals(String.valueOf(tuple.getChar(1))));
+    assertEquals((short)2048, tuple.getInt2(2));
+    assertEquals(4096, tuple.getInt4(3));
+    assertEquals(8192L, tuple.getInt8(4));
+    assertEquals(new Float(0.2f), new Float(tuple.getFloat4(5)));
+    assertEquals(new Double(4.1), new Double(tuple.getFloat8(6)));
+    assertTrue(HELLO.equals(tuple.getText(7)));
+    assertArrayEquals(HELLO.getBytes(Charsets.UTF_8), tuple.getBytes(8));
+    assertTrue(tuple.isBlankOrNull(9));
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 87b5c34..77b5894 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,13 +22,10 @@ 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.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.junit.Test;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import static org.junit.Assert.assertEquals;
 
 /**
@@ -50,7 +47,6 @@ public class TestSchemaConverter {
   private static final String CONVERTED_ALL_PARQUET_SCHEMA =
       "message table_schema {\n" +
       "  optional boolean myboolean;\n" +
-      "  optional int32 mybit;\n" +
       "  optional binary mychar (UTF8);\n" +
       "  optional int32 myint2;\n" +
       "  optional int32 myint4;\n" +
@@ -65,38 +61,33 @@ public class TestSchemaConverter {
       "}\n";
 
   private Schema createAllTypesSchema() {
-    List<Column> columns = new ArrayList<>();
-    columns.add(new Column("myboolean", Type.BOOLEAN));
-    columns.add(new Column("mybit", Type.BIT));
-    columns.add(new Column("mychar", Type.CHAR));
-    columns.add(new Column("myint2", Type.INT2));
-    columns.add(new Column("myint4", Type.INT4));
-    columns.add(new Column("myint8", Type.INT8));
-    columns.add(new Column("myfloat4", Type.FLOAT4));
-    columns.add(new Column("myfloat8", Type.FLOAT8));
-    columns.add(new Column("mytext", Type.TEXT));
-    columns.add(new Column("myblob", Type.BLOB));
-    columns.add(new Column("mynull", Type.NULL_TYPE));
-    columns.add(new Column("myinet4", Type.INET4));
-    columns.add(new Column("myprotobuf", Type.PROTOBUF));
-    Column[] columnsArray = new Column[columns.size()];
-    columnsArray = columns.toArray(columnsArray);
-    return SchemaFactory.newV1(columnsArray);
+    return SchemaBuilder.builder()
+        .add(new Column("myboolean", Type.BOOLEAN))
+        .add(new Column("mychar", Type.CHAR))
+        .add(new Column("myint2", Type.INT2))
+        .add(new Column("myint4", Type.INT4))
+        .add(new Column("myint8", Type.INT8))
+        .add(new Column("myfloat4", Type.FLOAT4))
+        .add(new Column("myfloat8", Type.FLOAT8))
+        .add(new Column("mytext", Type.TEXT))
+        .add(new Column("myblob", Type.BLOB))
+        .add(new Column("mynull", Type.NULL_TYPE))
+        .add(new Column("myinet4", Type.INET4))
+        .add(new Column("myprotobuf", Type.PROTOBUF))
+        .build();
   }
 
   private Schema createAllTypesConvertedSchema() {
-    List<Column> columns = new ArrayList<>();
-    columns.add(new Column("myboolean", Type.BOOLEAN));
-    columns.add(new Column("myint", Type.INT4));
-    columns.add(new Column("mylong", Type.INT8));
-    columns.add(new Column("myfloat", Type.FLOAT4));
-    columns.add(new Column("mydouble", Type.FLOAT8));
-    columns.add(new Column("mybytes", Type.BLOB));
-    columns.add(new Column("mystring", Type.TEXT));
-    columns.add(new Column("myfixed", Type.BLOB));
-    Column[] columnsArray = new Column[columns.size()];
-    columnsArray = columns.toArray(columnsArray);
-    return SchemaFactory.newV1(columnsArray);
+    return SchemaBuilder.builder()
+        .add(new Column("myboolean", Type.BOOLEAN))
+        .add(new Column("myint", Type.INT4))
+        .add(new Column("mylong", Type.INT8))
+        .add(new Column("myfloat", Type.FLOAT4))
+        .add(new Column("mydouble", Type.FLOAT8))
+        .add(new Column("mybytes", Type.BLOB))
+        .add(new Column("mystring", Type.TEXT))
+        .add(new Column("myfixed", Type.BLOB))
+        .build();
   }
 
   private void testTajoToParquetConversion(

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 1a5a41e..01fbc67 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
@@ -127,21 +127,22 @@ public class TestDirectRawFile {
   }
 
   static {
-    schema = SchemaFactory.newV1();
-    schema.addColumn("col0", TajoDataTypes.Type.BOOLEAN);
-    schema.addColumn("col1", TajoDataTypes.Type.INT2);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT8);
-    schema.addColumn("col4", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col6", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col7", TajoDataTypes.Type.TIMESTAMP);
-    schema.addColumn("col8", TajoDataTypes.Type.DATE);
-    schema.addColumn("col9", TajoDataTypes.Type.TIME);
-    schema.addColumn("col10", TajoDataTypes.Type.INTERVAL);
-    schema.addColumn("col11", TajoDataTypes.Type.INET4);
-    schema.addColumn("col12",
-        CatalogUtil.newDataType(TajoDataTypes.Type.PROTOBUF, PrimitiveProtos.StringProto.class.getName()));
+    schema = SchemaBuilder.builder()
+        .add("col0", TajoDataTypes.Type.BOOLEAN)
+        .add("col1", TajoDataTypes.Type.INT2)
+        .add("col2", TajoDataTypes.Type.INT4)
+        .add("col3", TajoDataTypes.Type.INT8)
+        .add("col4", TajoDataTypes.Type.FLOAT4)
+        .add("col5", TajoDataTypes.Type.FLOAT8)
+        .add("col6", TajoDataTypes.Type.TEXT)
+        .add("col7", TajoDataTypes.Type.TIMESTAMP)
+        .add("col8", TajoDataTypes.Type.DATE)
+        .add("col9", TajoDataTypes.Type.TIME)
+        .add("col10", TajoDataTypes.Type.INTERVAL)
+        .add("col11", TajoDataTypes.Type.INET4)
+        .add("col12",
+            CatalogUtil.newDataType(TajoDataTypes.Type.PROTOBUF, PrimitiveProtos.StringProto.class.getName()))
+        .build();
   }
 
   public FileStatus writeRowBlock(TajoConf conf, TableMeta meta, MemoryRowBlock rowBlock, Path outputFile)

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 f53c3ed..8f5e7a8 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
@@ -26,7 +26,10 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.common.TajoDataTypes.Type;
-import org.apache.tajo.exception.*;
+import org.apache.tajo.exception.SQLExceptionUtil;
+import org.apache.tajo.exception.TajoInternalError;
+import org.apache.tajo.exception.UndefinedTablespaceException;
+import org.apache.tajo.exception.UnsupportedDataTypeException;
 import org.apache.tajo.util.KeyValueSet;
 import org.apache.tajo.util.Pair;
 
@@ -208,12 +211,12 @@ public abstract class JdbcMetadataProviderBase implements MetadataProvider {
       });
 
       // transform the pair list into collection for columns
-      final Schema schema = SchemaFactory.newV1(Collections2.transform(columns, new Function<Pair<Integer,Column>, Column>() {
+      final Schema schema = SchemaBuilder.builder().addAll(Collections2.transform(columns, new Function<Pair<Integer,Column>, Column>() {
         @Override
         public Column apply(@Nullable Pair<Integer, Column> columnPair) {
           return columnPair.getSecond();
         }
-      }));
+      })).build();
 
 
       // fill the table stats


[6/6] tajo git commit: TAJO-2108: Refactor Schema to be immutable.

Posted by hy...@apache.org.
TAJO-2108: Refactor Schema to be immutable.

Closes #1000


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

Branch: refs/heads/master
Commit: 4aef83a39adf1055c212df5fac8b9451e24315b4
Parents: 71d2825
Author: Hyunsik Choi <hy...@apache.org>
Authored: Wed Apr 20 13:37:12 2016 -0700
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Wed Apr 20 13:37:12 2016 -0700

----------------------------------------------------------------------
 CHANGES                                         |   2 +
 .../org/apache/tajo/catalog/FieldConverter.java |  99 ++++++
 .../apache/tajo/catalog/ListSchemaBuilder.java  |  49 +++
 .../java/org/apache/tajo/catalog/Schema.java    |  14 -
 .../org/apache/tajo/catalog/SchemaBuilder.java  | 190 +++++++++++
 .../org/apache/tajo/catalog/SchemaFactory.java  |  21 --
 .../org/apache/tajo/catalog/SchemaLegacy.java   |  30 +-
 .../org/apache/tajo/catalog/SchemaUtil.java     |  35 +-
 .../apache/tajo/catalog/SetSchemaBuilder.java   |  66 ++++
 .../java/org/apache/tajo/catalog/TableDesc.java |   3 +-
 .../org/apache/tajo/catalog/TypeConverter.java  | 101 ++++++
 .../org/apache/tajo/catalog/TestIndexDesc.java  |   4 +-
 .../org/apache/tajo/catalog/TestSchema.java     | 172 +++++-----
 .../org/apache/tajo/catalog/TestTableDesc.java  |  14 +-
 .../org/apache/tajo/catalog/TestTableMeta.java  |  21 +-
 .../tajo/catalog/store/HiveCatalogStore.java    |  30 +-
 .../catalog/store/TestHiveCatalogStore.java     | 150 +++++----
 .../tajo/catalog/store/AbstractDBStore.java     |   9 +-
 .../apache/tajo/catalog/CatalogTestingUtil.java |  16 +-
 .../org/apache/tajo/catalog/TestCatalog.java    | 169 +++++-----
 .../TestCatalogAgainstCaseSensitivity.java      |  32 +-
 .../tajo/catalog/TestCatalogExceptions.java     |   9 +-
 .../tajo/catalog/TestLinkedMetadataManager.java |  10 +-
 .../org/apache/tajo/client/TajoClientUtil.java  |   6 +-
 .../apache/tajo/jdbc/TajoMetaDataResultSet.java |   9 +-
 .../org/apache/tajo/BackendTestingUtil.java     |   9 +-
 .../java/org/apache/tajo/schema/Identifier.java |  16 +
 .../apache/tajo/schema/QualifiedIdentifier.java |  15 +
 .../java/org/apache/tajo/schema/Schema.java     |  85 ++++-
 .../src/main/java/org/apache/tajo/type/Any.java |  33 ++
 .../main/java/org/apache/tajo/type/Array.java   |   5 +
 .../main/java/org/apache/tajo/type/Char.java    |   5 +
 .../main/java/org/apache/tajo/type/Inet4.java   |  28 ++
 .../java/org/apache/tajo/type/Interval.java     |  28 ++
 .../main/java/org/apache/tajo/type/Null.java    |  28 ++
 .../java/org/apache/tajo/type/Protobuf.java     |  42 +++
 .../main/java/org/apache/tajo/type/Type.java    |  25 ++
 .../main/java/org/apache/tajo/type/Varchar.java |   5 +
 .../apache/tajo/cli/tools/TestDDLBuilder.java   |  34 +-
 .../tajo/cli/tsql/TestTajoCliNegatives.java     |   2 +-
 .../TestCatalogAdminClientExceptions.java       |   9 +-
 .../engine/codegen/TestEvalCodeGenerator.java   |  99 +++---
 .../apache/tajo/engine/eval/TestEvalTree.java   |  11 +-
 .../tajo/engine/eval/TestEvalTreeUtil.java      |  11 +-
 .../apache/tajo/engine/eval/TestPredicates.java | 150 ++++-----
 .../tajo/engine/eval/TestSQLExpression.java     | 121 ++-----
 .../engine/function/TestBuiltinFunctions.java   | 241 +++++++------
 .../function/TestConditionalExpressions.java    |  52 +--
 .../engine/function/TestDateTimeFunctions.java  |  31 +-
 .../tajo/engine/function/TestMathFunctions.java | 260 +++++++-------
 .../function/TestPatternMatchingPredicates.java |   7 +-
 .../TestStringOperatorsAndFunctions.java        | 220 ++++++------
 .../function/TestUserDefinedFunctions.java      |   7 +-
 .../engine/planner/TestJoinOrderAlgorithm.java  |  42 ++-
 .../engine/planner/TestLogicalOptimizer.java    |  31 +-
 .../tajo/engine/planner/TestLogicalPlanner.java |  69 ++--
 .../tajo/engine/planner/TestPlannerUtil.java    |  60 ++--
 .../planner/TestUniformRangePartition.java      | 203 ++++++-----
 .../planner/physical/TestExternalSortExec.java  |   8 +-
 .../physical/TestFullOuterHashJoinExec.java     |  40 ++-
 .../physical/TestFullOuterMergeJoinExec.java    |  49 +--
 .../planner/physical/TestHashAntiJoinExec.java  |  24 +-
 .../planner/physical/TestHashJoinExec.java      |  24 +-
 .../planner/physical/TestHashSemiJoinExec.java  |  24 +-
 .../physical/TestLeftOuterHashJoinExec.java     |  40 ++-
 .../planner/physical/TestMergeJoinExec.java     |  24 +-
 .../planner/physical/TestPhysicalPlanner.java   |  22 +-
 .../physical/TestProgressExternalSortExec.java  |   9 +-
 .../engine/planner/physical/TestRadixSort.java  |   6 +-
 .../physical/TestRightOuterHashJoinExec.java    |  33 +-
 .../physical/TestRightOuterMergeJoinExec.java   |  50 +--
 .../engine/planner/physical/TestSortExec.java   |  14 +-
 .../planner/physical/TestSortIntersectExec.java |  24 +-
 .../planner/physical/TestTupleSorter.java       |   4 +-
 .../planner/physical/TestUnSafeTuple.java       |   4 +-
 .../tajo/engine/query/TestGroupByQuery.java     |  36 +-
 .../tajo/engine/query/TestHBaseTable.java       |  79 +++--
 .../apache/tajo/engine/query/TestJoinQuery.java |  42 ++-
 .../tajo/engine/query/TestNullValues.java       |  75 +++--
 .../tajo/engine/query/TestSelectQuery.java      |   9 +-
 .../apache/tajo/engine/query/TestSortQuery.java |  58 ++--
 .../tajo/engine/query/TestTablePartitions.java  |  16 +-
 .../tajo/engine/query/TestWindowQuery.java      |  39 ++-
 .../apache/tajo/engine/util/BenchmarkSort.java  |   4 +-
 .../apache/tajo/engine/util/TestTupleUtil.java  |  95 +++---
 .../org/apache/tajo/storage/TestRowFile.java    |  11 +-
 .../create_table_various_types.sql              |  24 +-
 .../java/org/apache/tajo/benchmark/TPCH.java    | 218 ++++++------
 .../global/builder/DistinctGroupbyBuilder.java  |  10 +-
 .../planner/physical/BSTIndexScanExec.java      |  46 +--
 .../planner/physical/ColPartitionStoreExec.java |  12 +-
 .../engine/planner/physical/SeqScanExec.java    |  35 +-
 .../engine/planner/physical/WindowAggExec.java  |  10 +-
 .../exec/ExplainPlanPreprocessorForTest.java    |   7 +-
 .../apache/tajo/master/exec/QueryExecutor.java  |   4 +-
 .../apache/tajo/querymaster/Repartitioner.java  |   2 +-
 .../apache/tajo/jdbc/TajoDatabaseMetaData.java  |  31 +-
 .../org/apache/tajo/jdbc/TestResultSet.java     |  18 +-
 .../apache/tajo/jdbc/TestTajoJdbcNegative.java  |   2 +-
 .../org/apache/tajo/plan/LogicalPlanner.java    |  67 ++--
 .../org/apache/tajo/plan/expr/EvalTreeUtil.java |  23 +-
 .../function/python/PythonScriptEngine.java     |  24 +-
 .../tajo/plan/logical/CreateTableNode.java      |   5 +-
 .../apache/tajo/plan/logical/InsertNode.java    |   8 +-
 .../org/apache/tajo/plan/logical/ScanNode.java  |   2 +-
 .../plan/rewrite/SelfDescSchemaBuildPhase.java  |  26 +-
 .../tajo/plan/rewrite/rules/IndexScanInfo.java  |  17 +-
 .../rewrite/rules/PartitionedTableRewriter.java |   7 +-
 .../org/apache/tajo/plan/util/PlannerUtil.java  |  33 +-
 .../org/apache/tajo/plan/TestLogicalNode.java   |  11 +-
 .../org/apache/tajo/storage/MergeScanner.java   |   4 +-
 .../org/apache/tajo/storage/TupleRange.java     |  19 +-
 .../org/apache/tajo/storage/TestLazyTuple.java  |  67 ++--
 .../tajo/storage/TestTupleComparator.java       |  29 +-
 .../tajo/storage/hbase/TestColumnMapping.java   |  13 +-
 .../tajo/storage/parquet/ParquetScanner.java    |   5 +-
 .../storage/parquet/TajoSchemaConverter.java    |   4 +-
 .../storage/thirdparty/orc/OrcRecordReader.java |  17 +-
 .../tajo/storage/TestCompressionStorages.java   |  11 +-
 .../tajo/storage/TestDelimitedTextFile.java     |  26 +-
 .../apache/tajo/storage/TestFileSystems.java    |  11 +-
 .../apache/tajo/storage/TestFileTablespace.java |  38 ++-
 .../org/apache/tajo/storage/TestLineReader.java |  46 +--
 .../apache/tajo/storage/TestMergeScanner.java   |  20 +-
 .../org/apache/tajo/storage/TestStorages.java   | 336 ++++++++++---------
 .../apache/tajo/storage/index/TestBSTIndex.java |  90 ++---
 .../index/TestSingleCSVFileBSTIndex.java        |  27 +-
 .../apache/tajo/storage/json/TestJsonSerDe.java |  42 ++-
 .../tajo/storage/parquet/TestReadWrite.java     |  43 ++-
 .../storage/parquet/TestSchemaConverter.java    |  59 ++--
 .../tajo/storage/raw/TestDirectRawFile.java     |  31 +-
 .../storage/jdbc/JdbcMetadataProviderBase.java  |   9 +-
 132 files changed, 3333 insertions(+), 2364 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index ce8994d..244c261 100644
--- a/CHANGES
+++ b/CHANGES
@@ -10,6 +10,8 @@ Release 0.12.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-2108: Refactor Schema to be immutable. (hyunsik)
+
     TAJO-2112: Improve disk load, when queries run simultaneously. (jinho)
 
     TAJO-2104: Implement Identifier which supports quotation information. 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FieldConverter.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FieldConverter.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FieldConverter.java
new file mode 100644
index 0000000..616b44e
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/FieldConverter.java
@@ -0,0 +1,99 @@
+/**
+ * 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.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableList;
+import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.exception.NotImplementedException;
+import org.apache.tajo.exception.TajoRuntimeException;
+import org.apache.tajo.schema.Identifier;
+import org.apache.tajo.schema.IdentifierPolicy;
+import org.apache.tajo.schema.QualifiedIdentifier;
+import org.apache.tajo.schema.Schema;
+import org.apache.tajo.schema.Schema.NamedPrimitiveType;
+import org.apache.tajo.schema.Schema.NamedStructType;
+import org.apache.tajo.type.*;
+
+import javax.annotation.Nullable;
+import java.util.Collection;
+
+public class FieldConverter {
+
+  public static QualifiedIdentifier toQualifiedIdentifier(String name) {
+    final Collection<String> elems = ImmutableList.copyOf(name.split("\\."));
+    final Collection<Identifier> identifiers = Collections2.transform(elems, new Function<String, Identifier>() {
+      @Override
+      public Identifier apply(@Nullable String input) {
+        boolean needQuote = CatalogUtil.isShouldBeQuoted(input);
+        return Identifier._(input, needQuote);
+      }
+    });
+    return QualifiedIdentifier.$(identifiers);
+  }
+
+  public static TypeDesc convert(Schema.NamedType src) {
+    if (src instanceof NamedStructType) {
+      NamedStructType structType = (NamedStructType) src;
+
+      ImmutableList.Builder<Column> fields = ImmutableList.builder();
+      for (Schema.NamedType t: structType.fields()) {
+        fields.add(new Column(t.name().raw(IdentifierPolicy.DefaultPolicy()), convert(t)));
+      }
+
+      return new TypeDesc(SchemaBuilder.builder().addAll(fields.build()).build());
+    } else {
+      final NamedPrimitiveType namedType = (NamedPrimitiveType) src;
+      final Type type = namedType.type();
+      if (type instanceof Char) {
+        Char charType = (Char) type;
+        return new TypeDesc(CatalogUtil.newDataTypeWithLen(TajoDataTypes.Type.CHAR, charType.length()));
+      } else if (type instanceof Varchar) {
+        Varchar varcharType = (Varchar) type;
+        return new TypeDesc(CatalogUtil.newDataTypeWithLen(TajoDataTypes.Type.VARCHAR, varcharType.length()));
+      } else if (type instanceof Numeric) {
+        Numeric numericType = (Numeric) type;
+        return new TypeDesc(CatalogUtil.newDataTypeWithLen(TajoDataTypes.Type.NUMERIC, numericType.precision()));
+      } else if (type instanceof Protobuf) {
+        Protobuf protobuf = (Protobuf) type;
+        return new TypeDesc(CatalogUtil.newDataType(TajoDataTypes.Type.PROTOBUF, protobuf.getMessageName()));
+      } else {
+        return new TypeDesc(TypeConverter.convert(namedType.type()));
+      }
+    }
+  }
+
+  public static Schema.NamedType convert(Column column) {
+    if (column.getTypeDesc().getDataType().getType() == TajoDataTypes.Type.RECORD) {
+
+      if (column.getTypeDesc().getNestedSchema() == null) {
+        throw new TajoRuntimeException(new NotImplementedException("record type projection"));
+      }
+
+      return new NamedStructType(toQualifiedIdentifier(column.getQualifiedName()),
+          TypeConverter.convert(column.getTypeDesc()));
+
+    } else {
+      return new NamedPrimitiveType(toQualifiedIdentifier(column.getQualifiedName()),
+          TypeConverter.convert(column.getDataType())
+      );
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/ListSchemaBuilder.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/ListSchemaBuilder.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/ListSchemaBuilder.java
new file mode 100644
index 0000000..e0c9d9e
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/ListSchemaBuilder.java
@@ -0,0 +1,49 @@
+/**
+ * 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.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableList;
+import org.apache.tajo.schema.Schema.NamedType;
+
+import java.util.Iterator;
+
+public class ListSchemaBuilder implements SchemaBuilder.SchemaCollector {
+  private final ImmutableList.Builder<NamedType> fields = new ImmutableList.Builder();
+
+  @Override
+  public void add(NamedType namedType) {
+    fields.add(namedType);
+  }
+
+  @Override
+  public void addAll(Iterator<NamedType> fields) {
+    this.fields.addAll(fields);
+  }
+
+  @Override
+  public void addAll(Iterable<NamedType> fields) {
+    this.fields.addAll(fields);
+  }
+
+  @Override
+  public ImmutableCollection<NamedType> build() {
+    return fields.build();
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 1b4c1eb..ec6af2c 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
@@ -20,8 +20,6 @@ package org.apache.tajo.catalog;
 
 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.json.GsonObject;
 
 import java.util.Collection;
@@ -90,18 +88,6 @@ public interface Schema extends ProtoObject<SchemaProto>, Cloneable, GsonObject
    */
   boolean containsAny(Collection<Column> columns);
 
-  Schema addColumn(String name, TypeDesc typeDesc);
-
-  Schema addColumn(String name, Type type);
-
-  Schema addColumn(String name, Type type, int length);
-
-  Schema addColumn(String name, DataType dataType);
-	
-	void addColumn(Column column);
-	
-	void addColumns(Schema schema);
-
 
   @Override
 	boolean equals(Object o);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaBuilder.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaBuilder.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaBuilder.java
new file mode 100644
index 0000000..35e38b5
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SchemaBuilder.java
@@ -0,0 +1,190 @@
+/**
+ * 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.Function;
+import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableList;
+import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.schema.QualifiedIdentifier;
+import org.apache.tajo.schema.Schema.NamedPrimitiveType;
+import org.apache.tajo.schema.Schema.NamedStructType;
+import org.apache.tajo.schema.Schema.NamedType;
+import org.apache.tajo.type.Type;
+
+import javax.annotation.Nullable;
+import java.util.Collection;
+import java.util.Iterator;
+
+import static org.apache.tajo.catalog.FieldConverter.toQualifiedIdentifier;
+import static org.apache.tajo.schema.IdentifierPolicy.DefaultPolicy;
+
+/**
+ * Builder for Schema
+ */
+public class SchemaBuilder {
+  private final SchemaCollector fields;
+
+  public interface SchemaCollector {
+    void add(NamedType field);
+    void addAll(Iterator<NamedType> fields);
+    void addAll(Iterable<NamedType> fields);
+    ImmutableCollection<NamedType> build();
+  }
+
+  public static SchemaLegacy empty() {
+    return builder().build();
+  }
+
+  public static SchemaBuilder builder() {
+    return new SchemaBuilder(new ListSchemaBuilder());
+  }
+
+  public static SchemaBuilder uniqueNameBuilder() {
+    return new SchemaBuilder(new SetSchemaBuilder());
+  }
+
+  SchemaBuilder(SchemaCollector collector) {
+    this.fields = collector;
+  }
+
+  public SchemaBuilder add(NamedType namedType) {
+    fields.add(namedType);
+    return this;
+  }
+
+  public SchemaBuilder add(QualifiedIdentifier id, Type type) {
+    add(new NamedPrimitiveType(id, type));
+    return this;
+  }
+
+  public SchemaBuilder addStruct(QualifiedIdentifier id, Collection<NamedType> fields) {
+    add(new NamedStructType(id, fields));
+    return this;
+  }
+
+  @Deprecated
+  public SchemaBuilder add(String name, TypeDesc legacyType) {
+    if (legacyType.getDataType().getType() == TajoDataTypes.Type.RECORD) {
+      addStruct(toQualifiedIdentifier(name), TypeConverter.convert(legacyType));
+    } else {
+      add(toQualifiedIdentifier(name), TypeConverter.convert(legacyType.getDataType()));
+    }
+    return this;
+  }
+
+  @Deprecated
+  public SchemaBuilder add(String name, TajoDataTypes.DataType dataType) {
+    add(name, new TypeDesc(dataType));
+    return this;
+  }
+
+  @Deprecated
+  public SchemaBuilder add(String name, TajoDataTypes.Type baseType) {
+    add(name, new TypeDesc(CatalogUtil.newSimpleDataType(baseType)));
+    return this;
+  }
+
+  @Deprecated
+  public SchemaBuilder add(Column column) {
+    add(FieldConverter.convert(column));
+    return this;
+  }
+
+  @Deprecated
+  public SchemaBuilder addAll(Iterable<Column> columns) {
+    return addAll2(columns, new Function<Column, NamedType>() {
+      @Override
+      public NamedType apply(@Nullable Column input) {
+        return FieldConverter.convert(input);
+      }
+    });
+  }
+
+  @Deprecated
+  public SchemaBuilder addAll(Column [] columns) {
+    return addAll2(columns, new Function<Column, NamedType>() {
+      @Override
+      public NamedType apply(@Nullable Column input) {
+        return FieldConverter.convert(input);
+      }
+    });
+  }
+
+  @Deprecated
+  public <T> SchemaBuilder addAll(T [] fields, Function<T, Column> fn) {
+    for (T t : fields) {
+      add(fn.apply(t));
+    }
+    return this;
+  }
+
+  @Deprecated
+  public <T> SchemaBuilder addAll(Iterable<T> fields, Function<T, Column> fn) {
+    for (T t : fields) {
+      add(fn.apply(t));
+    }
+    return this;
+  }
+
+  @Deprecated
+  public <T> SchemaBuilder addAll(Iterator<T> fields, Function<T, Column> fn) {
+    while(fields.hasNext()) {
+      T t = fields.next();
+      add(fn.apply(t));
+    }
+    return this;
+  }
+
+  public <T> SchemaBuilder addAll2(T [] fields, Function<T, NamedType> fn) {
+    for (T t : fields) {
+      add(fn.apply(t));
+    }
+    return this;
+  }
+
+  public <T> SchemaBuilder addAll2(Iterable<T> fields, Function<T, NamedType> fn) {
+    for (T t : fields) {
+      add(fn.apply(t));
+    }
+    return this;
+  }
+
+  public <T> SchemaBuilder addAll2(Iterator<T> fields, Function<T, NamedType> fn) {
+    while(fields.hasNext()) {
+      T t = fields.next();
+      add(fn.apply(t));
+    }
+    return this;
+  }
+
+  @Deprecated
+  public SchemaLegacy build() {
+    ImmutableList.Builder<Column> columns = new ImmutableList.Builder();
+    for (NamedType namedType : fields.build()) {
+      columns.add(new Column(namedType.name().raw(DefaultPolicy()), FieldConverter.convert(namedType)));
+    }
+
+    return new SchemaLegacy(columns.build());
+  }
+
+  public org.apache.tajo.schema.Schema buildV2() {
+    return new org.apache.tajo.schema.Schema(fields.build());
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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
index fb6910b..d2a5a06 100644
--- 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
@@ -19,30 +19,9 @@
 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/4aef83a3/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
index f23d519..2a16fa6 100644
--- 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
@@ -424,8 +424,7 @@ public class SchemaLegacy implements Schema, ProtoObject<SchemaProto>, Cloneable
     return false;
   }
 
-  @Override
-  public synchronized SchemaLegacy addColumn(String name, TypeDesc typeDesc) {
+  private SchemaLegacy addColumn(String name, TypeDesc typeDesc) {
     String normalized = name;
     if(fieldsByQualifiedName.containsKey(normalized)) {
       throw new TajoRuntimeException(new DuplicateColumnException(normalized));
@@ -441,36 +440,11 @@ public class SchemaLegacy implements Schema, ProtoObject<SchemaProto>, Cloneable
     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) {
+	private 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);
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 0c62ae5..c0b60a3 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
@@ -23,9 +23,7 @@ import com.google.common.collect.Lists;
 import org.apache.tajo.exception.TajoRuntimeException;
 import org.apache.tajo.exception.UnsupportedDataTypeException;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
 
 import static org.apache.tajo.common.TajoDataTypes.DataType;
 import static org.apache.tajo.common.TajoDataTypes.Type;
@@ -42,17 +40,19 @@ 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 = SchemaFactory.newV1();
+    SchemaBuilder merged = SchemaBuilder.builder();
+    Set<String> nameSet = new HashSet<>();
+
     for(Column col : left.getRootColumns()) {
-      if (!merged.containsByQualifiedName(col.getQualifiedName())) {
-        merged.addColumn(col);
-      }
+      merged.add(col);
+      nameSet.add(col.getQualifiedName());
     }
     for(Column col : right.getRootColumns()) {
-      if (merged.containsByQualifiedName(col.getQualifiedName())) {
-        merged.addColumn("?fake" + (tmpColumnSeq++), col.getDataType());
+      if (nameSet.contains(col.getQualifiedName())) {
+        merged.add("?fake" + (tmpColumnSeq++), col.getDataType());
       } else {
-        merged.addColumn(col);
+        merged.add(col);
+        nameSet.add(col.getQualifiedName());
       }
     }
 
@@ -60,25 +60,28 @@ public class SchemaUtil {
     if (tmpColumnSeq < 0) {
       tmpColumnSeq = 0;
     }
-    return merged;
+    return merged.build();
   }
 
   /**
    * Get common columns to be used as join keys of natural joins.
    */
   public static Schema getNaturalJoinColumns(Schema left, Schema right) {
-    Schema common = SchemaFactory.newV1();
+
+    SchemaBuilder common = SchemaBuilder.builder();
+    Set<String> commonNames = new HashSet<>();
     for (Column outer : left.getRootColumns()) {
-      if (!common.containsByName(outer.getSimpleName()) && right.containsByName(outer.getSimpleName())) {
-        common.addColumn(new Column(outer.getSimpleName(), outer.getDataType()));
+      if (!commonNames.contains(outer.getSimpleName()) && right.containsByName(outer.getSimpleName())) {
+        common.add(new Column(outer.getSimpleName(), outer.getDataType()));
+        commonNames.add(outer.getSimpleName());
       }
     }
     
-    return common;
+    return common.build();
   }
 
   public static Schema getQualifiedLogicalSchema(TableDesc tableDesc, String tableName) {
-    Schema logicalSchema = SchemaFactory.newV1(tableDesc.getLogicalSchema());
+    Schema logicalSchema = SchemaBuilder.builder().addAll(tableDesc.getLogicalSchema().getRootColumns()).build();
     if (tableName != null) {
       logicalSchema.setQualifier(tableName);
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SetSchemaBuilder.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SetSchemaBuilder.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SetSchemaBuilder.java
new file mode 100644
index 0000000..b66aac2
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/SetSchemaBuilder.java
@@ -0,0 +1,66 @@
+/**
+ * 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.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableList;
+import org.apache.commons.collections.collection.UnmodifiableCollection;
+import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.schema.QualifiedIdentifier;
+import org.apache.tajo.schema.Schema.NamedPrimitiveType;
+import org.apache.tajo.schema.Schema.NamedStructType;
+import org.apache.tajo.schema.Schema.NamedType;
+import org.apache.tajo.type.Type;
+
+import java.util.*;
+
+import static org.apache.tajo.catalog.FieldConverter.toQualifiedIdentifier;
+import static org.apache.tajo.schema.IdentifierPolicy.DefaultPolicy;
+
+public class SetSchemaBuilder implements SchemaBuilder.SchemaCollector {
+  private final Set<QualifiedIdentifier> nameSet = new HashSet<>();
+  private final ImmutableList.Builder<NamedType> fields = new ImmutableList.Builder();
+
+  @Override
+  public void add(NamedType namedType) {
+    if (!nameSet.contains(namedType.name())) {
+      fields.add(namedType);
+      nameSet.add(namedType.name());
+    }
+  }
+
+  @Override
+  public void addAll(Iterator<NamedType> fields) {
+    while (fields.hasNext()) {
+      add(fields.next());
+    }
+  }
+
+  @Override
+  public void addAll(Iterable<NamedType> fields) {
+    for (NamedType n : fields) {
+      add(n);
+    }
+  }
+
+  @Override
+  public ImmutableCollection<NamedType> build() {
+    return fields.build();
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 392a83d..8122bd5 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
@@ -122,8 +122,7 @@ public class TableDesc implements ProtoObject<TableDescProto>, GsonObject, Clone
 
   public Schema getLogicalSchema() {
     if (hasPartition()) {
-      Schema logicalSchema = SchemaFactory.newV1(schema);
-      logicalSchema.addColumns(getPartitionMethod().getExpressionSchema());
+      Schema logicalSchema = SchemaUtil.merge(schema, getPartitionMethod().getExpressionSchema());
       logicalSchema.setQualifier(tableName);
       return logicalSchema;
     } else {

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TypeConverter.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TypeConverter.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TypeConverter.java
new file mode 100644
index 0000000..f82cc03
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/TypeConverter.java
@@ -0,0 +1,101 @@
+/**
+ * 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.collect.ImmutableList;
+import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.exception.TajoRuntimeException;
+import org.apache.tajo.exception.UnsupportedException;
+import org.apache.tajo.schema.Schema;
+import org.apache.tajo.type.Protobuf;
+import org.apache.tajo.type.Type;
+
+import java.util.Collection;
+
+import static org.apache.tajo.type.Type.*;
+
+public class TypeConverter {
+
+  public static Collection<Schema.NamedType> convert(TypeDesc type) {
+    ImmutableList.Builder<Schema.NamedType> fields = ImmutableList.builder();
+    for (Column c : type.getNestedSchema().getRootColumns()) {
+      fields.add(FieldConverter.convert(c));
+    }
+    return fields.build();
+  }
+
+  public static Type convert(TajoDataTypes.Type legacyBaseType) {
+    switch (legacyBaseType) {
+    case BOOLEAN:
+      return Bool();
+    case INT1:
+    case INT2:
+      return Int2();
+    case INT4:
+      return Int4();
+    case INT8:
+      return Int8();
+    case FLOAT4:
+      return Float4();
+    case FLOAT8:
+      return Float8();
+    case DATE:
+      return Date();
+    case TIME:
+      return Time();
+    case TIMESTAMP:
+      return Timestamp();
+    case INTERVAL:
+      return Interval();
+    case TEXT:
+      return Text();
+    case BLOB:
+      return Blob();
+    case INET4:
+      return Inet4();
+    case NULL_TYPE:
+      return Null();
+    case ANY:
+      return Any();
+    default:
+      throw new TajoRuntimeException(new UnsupportedException(legacyBaseType.name()));
+    }
+  }
+
+  public static Type convert(TajoDataTypes.DataType legacyType) {
+    switch (legacyType.getType()) {
+    case NCHAR:
+    case CHAR:
+      return Char(legacyType.getLength());
+    case NVARCHAR:
+    case VARCHAR:
+      return Varchar(legacyType.getLength());
+    case NUMERIC:
+      return Numeric(legacyType.getLength());
+    case PROTOBUF:
+      return new Protobuf(legacyType.getCode());
+    default:
+      return convert(legacyType.getType());
+    }
+  }
+
+  public static TajoDataTypes.DataType convert(Type type) {
+    return CatalogUtil.newSimpleDataType(type.baseType());
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 0b7516e..52c68f0 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,8 +40,8 @@ public class TestIndexDesc {
 
   @BeforeClass
   public static void setUp() throws Exception {
-    relationSchema = SchemaFactory.newV1(new Column[]{new Column("id", Type.INT4),
-        new Column("score", Type.FLOAT8), new Column("name", Type.TEXT)});
+    relationSchema = SchemaBuilder.builder().addAll(new Column[]{new Column("id", Type.INT4),
+        new Column("score", Type.FLOAT8), new Column("name", Type.TEXT)}).build();
     SortSpec[] colSpecs1 = new SortSpec[1];
     colSpecs1[0] = new SortSpec(new Column("id", Type.INT4), true, true);
     desc1 = new IndexDesc(DEFAULT_DATABASE_NAME, "indexed",

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 6235945..a474730 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,18 +40,19 @@ public class TestSchema {
 
   static {
     // simple nested schema
-    nestedSchema1 = SchemaFactory.newV1();
-    nestedSchema1.addColumn("s1", Type.INT8);
+    SchemaBuilder builder1 = SchemaBuilder.builder();
+    builder1.add(new Column("s1", Type.INT8));
 
-    Schema nestedRecordSchema = SchemaFactory.newV1();
-    nestedRecordSchema.addColumn("s2", Type.FLOAT4);
-    nestedRecordSchema.addColumn("s3", Type.TEXT);
+    Schema nestedRecordSchema = SchemaBuilder.builder()
+        .add("s2", Type.FLOAT4)
+        .add("s3", Type.TEXT)
+        .build();
 
     Column nestedField = new Column("s4", new TypeDesc(nestedRecordSchema));
-    nestedSchema1.addColumn(nestedField);
-
-    nestedSchema1.addColumn("s5", Type.FLOAT8);
+    builder1.add(nestedField);
 
+    builder1.add(new Column("s5", Type.FLOAT8));
+    nestedSchema1 = builder1.build();
     // two level nested schema
     //
     // s1
@@ -63,25 +64,27 @@ public class TestSchema {
     //  |- s8
     //     |- s6
     //     |- s7
-    nestedSchema2 = SchemaFactory.newV1();
-    nestedSchema2.addColumn("s1", Type.INT8);
+    SchemaBuilder builder2 = SchemaBuilder.builder();
+    builder2.add(new Column("s1", Type.INT8));
 
-    Schema nestedRecordSchema1 = SchemaFactory.newV1();
-    nestedRecordSchema1.addColumn("s2", Type.FLOAT4);
-    nestedRecordSchema1.addColumn("s3", Type.TEXT);
+    Schema nestedRecordSchema1 = SchemaBuilder.builder()
+        .add("s2", Type.FLOAT4)
+        .add("s3", Type.TEXT)
+        .build();
 
     Column nestedField1 = new Column("s4", new TypeDesc(nestedRecordSchema1));
-    nestedSchema2.addColumn(nestedField1);
+    builder2.add(nestedField1);
 
-    nestedSchema2.addColumn("s5", Type.FLOAT8);
+    builder2.add(new Column("s5", Type.FLOAT8));
 
-    Schema nestedRecordSchema2 = SchemaFactory.newV1();
-    nestedRecordSchema2.addColumn("s6", Type.FLOAT4);
-    nestedRecordSchema2.addColumn("s7", Type.TEXT);
+    Schema nestedRecordSchema2 = SchemaBuilder.builder()
+        .add("s6", Type.FLOAT4)
+        .add("s7", Type.TEXT)
+        .build();
 
     Column nestedField2 = new Column("s8", new TypeDesc(nestedRecordSchema2));
-    nestedSchema2.addColumn(nestedField2);
-
+    builder2.add(nestedField2);
+    nestedSchema2 = builder2.build();
 
     // three level nested schema
     //
@@ -95,41 +98,42 @@ public class TestSchema {
     //      |- s8
     //  |- s9
 
-    nestedSchema3 = SchemaFactory.newV1();
-    nestedSchema3.addColumn("s1", Type.INT8);
+    SchemaBuilder builder3 = SchemaBuilder.builder();
 
-    nestedSchema3.addColumn("s2", Type.INT8);
+    builder3.add("s1", Type.INT8);
+    builder3.add("s2", Type.INT8);
 
-    Schema s5 = SchemaFactory.newV1();
-    s5.addColumn("s6", Type.INT8);
+    SchemaBuilder s5 = SchemaBuilder.builder();
+    s5.add("s6", Type.INT8);
 
-    Schema s7 = SchemaFactory.newV1();
-    s7.addColumn("s5", new TypeDesc(s5));
+    SchemaBuilder s7 = SchemaBuilder.builder();
+    s7.add("s5", new TypeDesc(s5.build()));
 
-    Schema s3 = SchemaFactory.newV1();
-    s3.addColumn("s4", Type.INT8);
-    s3.addColumn("s7", new TypeDesc(s7));
-    s3.addColumn("s8", Type.INT8);
+    SchemaBuilder s3 = SchemaBuilder.builder();
+    s3.add("s4", Type.INT8);
+    s3.add("s7", new TypeDesc(s7.build()));
+    s3.add("s8", Type.INT8);
 
-    nestedSchema3.addColumn("s3", new TypeDesc(s3));
-    nestedSchema3.addColumn("s9", Type.INT8);
+    builder3.add(new Column("s3", new TypeDesc(s3.build())));
+    builder3.add(new Column("s9", Type.INT8));
+    nestedSchema3 = builder3.build();
   }
 
 	@Before
 	public void setUp() throws Exception {
-		schema = SchemaFactory.newV1();
+    SchemaBuilder schemaBld = SchemaBuilder.builder();
 		col1 = new Column("name", Type.TEXT);
-		schema.addColumn(col1);
+		schemaBld.add(col1);
 		col2 = new Column("age", Type.INT4);
-		schema.addColumn(col2);
+		schemaBld.add(col2);
 		col3 = new Column("addr", Type.TEXT);
-		schema.addColumn(col3);
+		schemaBld.add(col3);
+    schema = schemaBld.build();
 	}
 
 	@Test
 	public final void testSchemaSchema() {
-		Schema schema2 = SchemaFactory.newV1(schema);
-		
+		Schema schema2 = SchemaBuilder.builder().addAll(schema.getRootColumns()).build();
 		assertEquals(schema, schema2);
 	}
 
@@ -149,20 +153,21 @@ public class TestSchema {
 
 	@Test
 	public final void testAddField() {
-		Schema schema = SchemaFactory.newV1();
+		Schema schema = SchemaBuilder.builder().build();
 		assertFalse(schema.containsByQualifiedName("studentId"));
-		schema.addColumn("studentId", Type.INT4);
-		assertTrue(schema.containsByQualifiedName("studentId"));
+    Schema schema2 = SchemaBuilder.builder().addAll(schema.getRootColumns()).add("studentId", Type.INT4).build();
+		assertTrue(schema2.containsByQualifiedName("studentId"));
 	}
 
 	@Test
 	public final void testEqualsObject() {
-		Schema schema2 = SchemaFactory.newV1();
-		schema2.addColumn("name", Type.TEXT);
-		schema2.addColumn("age", Type.INT4);
-		schema2.addColumn("addr", Type.TEXT);
-		
-		assertEquals(schema, schema2);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("name", Type.TEXT)
+        .add("age", Type.INT4)
+        .add("addr", Type.TEXT)
+        .build();
+
+    assertEquals(schema, schema2);
 	}
 
 	@Test
@@ -176,11 +181,12 @@ public class TestSchema {
 	
 	@Test
 	public final void testClone() throws CloneNotSupportedException {
-	  Schema schema = SchemaFactory.newV1();
-	  schema.addColumn("abc", Type.FLOAT8);
-	  schema.addColumn("bbc", Type.FLOAT8);
-	  
-	  Schema schema2 = SchemaFactory.newV1(schema.getProto());
+    Schema schema = SchemaBuilder.builder()
+        .add("abc", Type.FLOAT8)
+        .add("bbc", Type.FLOAT8)
+        .build();
+
+    Schema schema2 = SchemaFactory.newV1(schema.getProto());
 	  assertEquals(schema.getProto(), schema2.getProto());
 	  assertEquals(schema.getColumn(0), schema2.getColumn(0));
 	  assertEquals(schema.size(), schema2.size());
@@ -193,11 +199,12 @@ public class TestSchema {
 	
 	@Test(expected = TajoRuntimeException.class)
 	public final void testAddExistColumn() {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("abc", Type.FLOAT8);
-    schema.addColumn("bbc", Type.FLOAT8);
-    schema.addColumn("abc", Type.INT4);
-	}
+    SchemaBuilder.builder()
+        .add("abc", Type.FLOAT8)
+        .add("bbc", Type.FLOAT8)
+        .add("abc", Type.INT4)
+        .build();
+  }
 
 	@Test
 	public final void testJson() {
@@ -225,9 +232,10 @@ public class TestSchema {
     assertEquals(column, schema2.getColumn("age"));
     assertEquals(column, schema2.getColumn("test1.age"));
 
-    Schema schema3 = SchemaFactory.newV1();
-    schema3.addColumn("tb1.col1", Type.INT4);
-    schema3.addColumn("col2", Type.INT4);
+    Schema schema3 = SchemaBuilder.builder()
+        .add("tb1.col1", Type.INT4)
+        .add("col2", Type.INT4)
+        .build();
     assertEquals("tb1", schema3.getColumn(0).getQualifier());
     assertEquals("tb1.col1", schema3.getColumn(0).getQualifiedName());
     assertEquals("col1", schema3.getColumn(0).getSimpleName());
@@ -267,26 +275,28 @@ public class TestSchema {
 
   @Test
   public void testNestedRecord4() {
-    Schema root = SchemaFactory.newV1();
-
-    Schema nf2DotNf1 = SchemaFactory.newV1();
-    nf2DotNf1.addColumn("f1", Type.INT8);
-    nf2DotNf1.addColumn("f2", Type.INT8);
-
-    Schema nf2DotNf2 = SchemaFactory.newV1();
-    nf2DotNf2.addColumn("f1", Type.INT8);
-    nf2DotNf2.addColumn("f2", Type.INT8);
-
-    Schema nf2 = SchemaFactory.newV1();
-    nf2.addColumn("f1", Type.INT8);
-    nf2.addColumn("nf1", new TypeDesc(nf2DotNf1));
-    nf2.addColumn("nf2", new TypeDesc(nf2DotNf2));
-    nf2.addColumn("f2", Type.INT8);
-
-    root.addColumn("f1", Type.INT8);
-    root.addColumn("nf1", Type.INT8);
-    root.addColumn("nf2", new TypeDesc(nf2));
-    root.addColumn("f2", Type.INT8);
+
+    Schema nf2DotNf1 = SchemaBuilder.builder()
+        .add("f1", Type.INT8)
+        .add("f2", Type.INT8)
+        .build();
+
+    Schema nf2DotNf2 = SchemaBuilder.builder()
+        .add("f1", Type.INT8)
+        .add("f2", Type.INT8)
+        .build();
+
+    Schema nf2 = SchemaBuilder.builder()
+        .add("f1", Type.INT8)
+        .add("nf1", new TypeDesc(nf2DotNf1))
+        .add("nf2", new TypeDesc(nf2DotNf2))
+        .add("f2", Type.INT8).build();
+
+    Schema root = SchemaBuilder.builder()
+        .add("f1", Type.INT8)
+        .add("nf1", Type.INT8)
+        .add("nf2", new TypeDesc(nf2))
+        .add("f2", Type.INT8).build();
 
     verifySchema(root);
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 f334738..085975b 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,9 +41,10 @@ public class TestTableDesc {
 	
 	@Before
 	public void setup() throws IOException {
-	  schema = SchemaFactory.newV1();
-    schema.addColumn("name", Type.BLOB);
-    schema.addColumn("addr", Type.TEXT);
+    schema = SchemaBuilder.builder()
+        .add("name", Type.BLOB)
+        .add("addr", Type.TEXT)
+        .build();
     info = CatalogUtil.newTableMeta("TEXT");
     path = new Path(CommonTestingUtil.getTestDir(), "table1");
     desc = new TableDesc("table1", schema, info, path.toUri());
@@ -67,9 +68,10 @@ public class TestTableDesc {
 
   @Test
   public void test() throws CloneNotSupportedException, IOException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("name", Type.BLOB);
-    schema.addColumn("addr", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("name", Type.BLOB)
+        .add("addr", Type.TEXT)
+        .build();
     TableMeta info = CatalogUtil.newTableMeta("TEXT");
     testClone(info);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 2e4c6a9..c6f4d1a 100644
--- a/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableMeta.java
+++ b/tajo-catalog/tajo-catalog-common/src/test/java/org/apache/tajo/catalog/TestTableMeta.java
@@ -21,7 +21,6 @@ package org.apache.tajo.catalog;
 import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.catalog.json.CatalogGsonHelper;
 import org.apache.tajo.catalog.proto.CatalogProtos.TableProto;
-import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos;
 import org.junit.Before;
 import org.junit.Test;
@@ -37,10 +36,7 @@ public class TestTableMeta {
   }
   
   @Test
-  public void testTableMetaTableProto() {    
-    Schema schema1 = SchemaFactory.newV1();
-    schema1.addColumn("name", Type.BLOB);
-    schema1.addColumn("addr", Type.TEXT);
+  public void testTableMetaTableProto() {
     TableMeta meta1 = CatalogUtil.newTableMeta("TEXT");
     
     TableMeta meta2 = new TableMeta(meta1.getProto());
@@ -49,9 +45,6 @@ public class TestTableMeta {
   
   @Test
   public final void testClone() throws CloneNotSupportedException {
-    Schema schema1 = SchemaFactory.newV1();
-    schema1.addColumn("name", Type.BLOB);
-    schema1.addColumn("addr", Type.TEXT);
     TableMeta meta1 = CatalogUtil.newTableMeta("TEXT");
     
     TableMeta meta2 = (TableMeta) meta1.clone();
@@ -61,13 +54,8 @@ public class TestTableMeta {
   
   @Test
   public void testSchema() throws CloneNotSupportedException {
-    Schema schema1 = SchemaFactory.newV1();
-    schema1.addColumn("name", Type.BLOB);
-    schema1.addColumn("addr", Type.TEXT);
     TableMeta meta1 = CatalogUtil.newTableMeta("TEXT");
-    
     TableMeta meta2 = (TableMeta) meta1.clone();
-    
     assertEquals(meta1, meta2);
   }
   
@@ -77,13 +65,8 @@ public class TestTableMeta {
   }
   
   @Test
-  public void testEqualsObject() {   
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("name", Type.BLOB);
-    schema2.addColumn("addr", Type.TEXT);
+  public void testEqualsObject() {
     TableMeta meta2 = CatalogUtil.newTableMeta("TEXT");
-
-
     assertTrue(meta.equals(meta2));
     assertNotSame(meta, meta2);
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 954817c..6aa0585 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
@@ -46,6 +46,7 @@ import org.apache.tajo.algebra.Expr;
 import org.apache.tajo.algebra.IsNullPredicate;
 import org.apache.tajo.algebra.JsonHelper;
 import org.apache.tajo.catalog.*;
+import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.partition.PartitionMethodDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
@@ -134,7 +135,7 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
     org.apache.hadoop.hive.ql.metadata.Table table = null;
     Path path = null;
     String dataFormat = null;
-    org.apache.tajo.catalog.Schema schema = null;
+    Schema schema = null;
     KeyValueSet options = null;
     TableStats stats = null;
     PartitionMethodDesc partitions = null;
@@ -148,7 +149,7 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
       path = table.getPath();
 
       // convert HiveCatalogStore field schema into tajo field schema.
-      schema = SchemaFactory.newV1();
+      SchemaBuilder schemaBuilder = SchemaBuilder.builder();
 
       List<FieldSchema> fieldSchemaList = table.getCols();
       boolean isPartitionKey;
@@ -167,9 +168,10 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
           String fieldName = databaseName + CatalogConstants.IDENTIFIER_DELIMITER + tableName +
               CatalogConstants.IDENTIFIER_DELIMITER + eachField.getName();
           TajoDataTypes.Type dataType = HiveCatalogUtil.getTajoFieldType(eachField.getType());
-          schema.addColumn(fieldName, dataType);
+          schemaBuilder.add(fieldName, dataType);
         }
       }
+      schema = schemaBuilder.build();
 
       // validate field schema.
       HiveCatalogUtil.validateSchema(table);
@@ -238,7 +240,7 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
       List<FieldSchema> partitionKeys = table.getPartitionKeys();
 
       if (null != partitionKeys) {
-        org.apache.tajo.catalog.Schema expressionSchema = SchemaFactory.newV1();
+        SchemaBuilder expressionSchema = SchemaBuilder.builder();
         StringBuilder sb = new StringBuilder();
         if (partitionKeys.size() > 0) {
           for (int i = 0; i < partitionKeys.size(); i++) {
@@ -246,7 +248,7 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
             TajoDataTypes.Type dataType = HiveCatalogUtil.getTajoFieldType(fieldSchema.getType());
             String fieldName = databaseName + CatalogConstants.IDENTIFIER_DELIMITER + tableName +
                 CatalogConstants.IDENTIFIER_DELIMITER + fieldSchema.getName();
-            expressionSchema.addColumn(new Column(fieldName, dataType));
+            expressionSchema.add(new Column(fieldName, dataType));
             if (i > 0) {
               sb.append(",");
             }
@@ -257,7 +259,7 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
               tableName,
               PartitionType.COLUMN,
               sb.toString(),
-              expressionSchema);
+              expressionSchema.build());
         }
       }
     } catch (Throwable t) {
@@ -278,16 +280,6 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
     return tableDesc.getProto();
   }
 
-
-  private TajoDataTypes.Type getDataType(final String typeStr) {
-    try {
-      return Enum.valueOf(TajoDataTypes.Type.class, typeStr);
-    } catch (IllegalArgumentException iae) {
-      LOG.error("Cannot find a matched type against from '" + typeStr + "'");
-      return null;
-    }
-  }
-
   @Override
   public final List<String> getAllTableNames(String databaseName) {
     HiveCatalogStoreClientPool.HiveCatalogStoreClient client = null;
@@ -814,7 +806,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 = SchemaFactory.newV1();
+        SchemaBuilder expressionSchema = SchemaBuilder.builder();
         StringBuilder sb = new StringBuilder();
         if (partitionKeys.size() > 0) {
           for (int i = 0; i < partitionKeys.size(); i++) {
@@ -822,7 +814,7 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
             TajoDataTypes.Type dataType = HiveCatalogUtil.getTajoFieldType(fieldSchema.getType());
             String fieldName = databaseName + CatalogConstants.IDENTIFIER_DELIMITER + tableName +
                 CatalogConstants.IDENTIFIER_DELIMITER + fieldSchema.getName();
-            expressionSchema.addColumn(new Column(fieldName, dataType));
+            expressionSchema.add(new Column(fieldName, dataType));
             if (i > 0) {
               sb.append(",");
             }
@@ -833,7 +825,7 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
               tableName,
               PartitionType.COLUMN,
               sb.toString(),
-              expressionSchema);
+              expressionSchema.build());
         }
       } else {
         throw new UndefinedPartitionMethodException(tableName);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 e8d60cf..fdb1853 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,15 +95,16 @@ public class TestHiveCatalogStore {
   public void testTableUsingTextFile() throws Exception {
     TableMeta meta = new TableMeta(BuiltinStorages.TEXT, new KeyValueSet());
 
-    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);
-    schema.addColumn("c_nationkey", TajoDataTypes.Type.INT4);
-    schema.addColumn("c_phone", TajoDataTypes.Type.TEXT);
-    schema.addColumn("c_acctbal", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("c_mktsegment", TajoDataTypes.Type.TEXT);
-    schema.addColumn("c_comment", TajoDataTypes.Type.TEXT);
+    org.apache.tajo.catalog.Schema schema = SchemaBuilder.builder()
+        .add("c_custkey", TajoDataTypes.Type.INT4)
+        .add("c_name", TajoDataTypes.Type.TEXT)
+        .add("c_address", TajoDataTypes.Type.TEXT)
+        .add("c_nationkey", TajoDataTypes.Type.INT4)
+        .add("c_phone", TajoDataTypes.Type.TEXT)
+        .add("c_acctbal", TajoDataTypes.Type.FLOAT8)
+        .add("c_mktsegment", TajoDataTypes.Type.TEXT)
+        .add("c_comment", TajoDataTypes.Type.TEXT)
+        .build();
 
     TableDesc table = new TableDesc(CatalogUtil.buildFQName(DB_NAME, CUSTOMER), schema, meta,
         new Path(warehousePath, new Path(DB_NAME, CUSTOMER)).toUri());
@@ -135,10 +136,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("r_regionkey", TajoDataTypes.Type.INT4);
-    schema.addColumn("r_name", TajoDataTypes.Type.TEXT);
-    schema.addColumn("r_comment", TajoDataTypes.Type.TEXT);
+    org.apache.tajo.catalog.Schema schema = SchemaBuilder.builder()
+        .add("r_regionkey", TajoDataTypes.Type.INT4)
+        .add("r_name", TajoDataTypes.Type.TEXT)
+        .add("r_comment", TajoDataTypes.Type.TEXT)
+        .build();
 
     TableDesc table = new TableDesc(CatalogUtil.buildFQName(DB_NAME, REGION), schema, meta,
         new Path(warehousePath, new Path(DB_NAME, REGION)).toUri());
@@ -169,10 +171,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("r_regionkey", TajoDataTypes.Type.INT4);
-    schema.addColumn("r_name", TajoDataTypes.Type.TEXT);
-    schema.addColumn("r_comment", TajoDataTypes.Type.TEXT);
+    org.apache.tajo.catalog.Schema schema = SchemaBuilder.builder()
+        .add("r_regionkey", TajoDataTypes.Type.INT4)
+        .add("r_name", TajoDataTypes.Type.TEXT)
+        .add("r_comment", TajoDataTypes.Type.TEXT)
+        .build();
 
     TableDesc table = new TableDesc(CatalogUtil.buildFQName(DB_NAME, REGION), schema, meta,
         new Path(warehousePath, new Path(DB_NAME, REGION)).toUri());
@@ -203,14 +206,15 @@ public class TestHiveCatalogStore {
     options.set(StorageConstants.TEXT_NULL, StringEscapeUtils.escapeJava("\u0003"));
     TableMeta meta = new TableMeta(BuiltinStorages.TEXT, options);
 
-    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);
-    schema.addColumn("s_nationkey", TajoDataTypes.Type.INT4);
-    schema.addColumn("s_phone", TajoDataTypes.Type.TEXT);
-    schema.addColumn("s_acctbal", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("s_comment", TajoDataTypes.Type.TEXT);
+    org.apache.tajo.catalog.Schema schema = SchemaBuilder.builder()
+        .add("s_suppkey", TajoDataTypes.Type.INT4)
+        .add("s_name", TajoDataTypes.Type.TEXT)
+        .add("s_address", TajoDataTypes.Type.TEXT)
+        .add("s_nationkey", TajoDataTypes.Type.INT4)
+        .add("s_phone", TajoDataTypes.Type.TEXT)
+        .add("s_acctbal", TajoDataTypes.Type.FLOAT8)
+        .add("s_comment", TajoDataTypes.Type.TEXT)
+        .build();
 
     TableDesc table = new TableDesc(CatalogUtil.buildFQName(DB_NAME, SUPPLIER), schema, meta,
         new Path(warehousePath, new Path(DB_NAME, SUPPLIER)).toUri());
@@ -252,18 +256,20 @@ public class TestHiveCatalogStore {
   public void testAddTableByPartition() throws Exception {
     TableMeta meta = new TableMeta("TEXT", new KeyValueSet());
 
-    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);
+    org.apache.tajo.catalog.Schema schema = SchemaBuilder.builder()
+        .add("n_name", TajoDataTypes.Type.TEXT)
+        .add("n_regionkey", TajoDataTypes.Type.INT4)
+        .add("n_comment", TajoDataTypes.Type.TEXT)
+        .build();
 
 
     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 = SchemaFactory.newV1();
-    expressionSchema.addColumn("n_nationkey", TajoDataTypes.Type.INT4);
-    expressionSchema.addColumn("n_date", TajoDataTypes.Type.TEXT);
+    org.apache.tajo.catalog.Schema expressionSchema = SchemaBuilder.builder()
+        .add("n_nationkey", TajoDataTypes.Type.INT4)
+        .add("n_date", TajoDataTypes.Type.TEXT)
+        .build();
 
     PartitionMethodDesc partitions = new PartitionMethodDesc(
         DB_NAME,
@@ -500,10 +506,11 @@ public class TestHiveCatalogStore {
   @Test
   public void testGetAllTableNames() throws Exception{
     TableMeta meta = new TableMeta(BuiltinStorages.TEXT, new KeyValueSet());
-    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);
+    org.apache.tajo.catalog.Schema schema = SchemaBuilder.builder()
+        .add("n_name", TajoDataTypes.Type.TEXT)
+        .add("n_regionkey", TajoDataTypes.Type.INT4)
+        .add("n_comment", TajoDataTypes.Type.TEXT)
+        .build();
 
     String[] tableNames = new String[]{"table1", "table2", "table3"};
 
@@ -528,10 +535,11 @@ public class TestHiveCatalogStore {
   @Test
   public void testDeleteTable() throws Exception {
     TableMeta meta = new TableMeta(BuiltinStorages.TEXT, new KeyValueSet());
-    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);
+    org.apache.tajo.catalog.Schema schema = SchemaBuilder.builder()
+        .add("n_name", TajoDataTypes.Type.TEXT)
+        .add("n_regionkey", TajoDataTypes.Type.INT4)
+        .add("n_comment", TajoDataTypes.Type.TEXT)
+        .build();
 
     String tableName = "table1";
     TableDesc table = new TableDesc(DB_NAME + "." + tableName, schema, meta, warehousePath.toUri());
@@ -553,10 +561,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("r_regionkey", TajoDataTypes.Type.INT4);
-    schema.addColumn("r_name", TajoDataTypes.Type.TEXT);
-    schema.addColumn("r_comment", TajoDataTypes.Type.TEXT);
+    org.apache.tajo.catalog.Schema schema = SchemaBuilder.builder()
+        .add("r_regionkey", TajoDataTypes.Type.INT4)
+        .add("r_name", TajoDataTypes.Type.TEXT)
+        .add("r_comment", TajoDataTypes.Type.TEXT)
+        .build();
 
     TableDesc table = new TableDesc(CatalogUtil.buildFQName(DB_NAME, REGION), schema, meta,
         new Path(warehousePath, new Path(DB_NAME, REGION)).toUri());
@@ -587,10 +596,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("r_regionkey", TajoDataTypes.Type.INT4);
-    schema.addColumn("r_name", TajoDataTypes.Type.TEXT);
-    schema.addColumn("r_comment", TajoDataTypes.Type.TEXT);
+    org.apache.tajo.catalog.Schema schema = SchemaBuilder.builder()
+        .add("r_regionkey", TajoDataTypes.Type.INT4)
+        .add("r_name", TajoDataTypes.Type.TEXT)
+        .add("r_comment", TajoDataTypes.Type.TEXT)
+        .build();
 
     TableDesc table = new TableDesc(CatalogUtil.buildFQName(DB_NAME, REGION), schema, meta,
         new Path(warehousePath, new Path(DB_NAME, REGION)).toUri());
@@ -619,15 +629,16 @@ public class TestHiveCatalogStore {
   public void testTableUsingParquet() throws Exception {
     TableMeta meta = new TableMeta("PARQUET", new KeyValueSet());
 
-    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);
-    schema.addColumn("c_nationkey", TajoDataTypes.Type.INT4);
-    schema.addColumn("c_phone", TajoDataTypes.Type.TEXT);
-    schema.addColumn("c_acctbal", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("c_mktsegment", TajoDataTypes.Type.TEXT);
-    schema.addColumn("c_comment", TajoDataTypes.Type.TEXT);
+    org.apache.tajo.catalog.Schema schema = SchemaBuilder.builder()
+        .add("c_custkey", TajoDataTypes.Type.INT4)
+        .add("c_name", TajoDataTypes.Type.TEXT)
+        .add("c_address", TajoDataTypes.Type.TEXT)
+        .add("c_nationkey", TajoDataTypes.Type.INT4)
+        .add("c_phone", TajoDataTypes.Type.TEXT)
+        .add("c_acctbal", TajoDataTypes.Type.FLOAT8)
+        .add("c_mktsegment", TajoDataTypes.Type.TEXT)
+        .add("c_comment", TajoDataTypes.Type.TEXT)
+        .build();
 
     TableDesc table = new TableDesc(CatalogUtil.buildFQName(DB_NAME, CUSTOMER), schema, meta,
         new Path(warehousePath, new Path(DB_NAME, CUSTOMER)).toUri());
@@ -656,18 +667,19 @@ public class TestHiveCatalogStore {
 
     TableMeta meta = new TableMeta(BuiltinStorages.TEXT, new KeyValueSet());
 
-    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);
-    schema.addColumn("col4", TajoDataTypes.Type.INT8);
-    schema.addColumn("col5", TajoDataTypes.Type.BOOLEAN);
-    schema.addColumn("col6", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col7", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col8", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col9", TajoDataTypes.Type.BLOB);
-    schema.addColumn("col10", TajoDataTypes.Type.TIMESTAMP);
-    schema.addColumn("col11", TajoDataTypes.Type.DATE);
+    org.apache.tajo.catalog.Schema schema = SchemaBuilder.builder()
+        .add("col1", TajoDataTypes.Type.INT4)
+        .add("col2", TajoDataTypes.Type.INT1)
+        .add("col3", TajoDataTypes.Type.INT2)
+        .add("col4", TajoDataTypes.Type.INT8)
+        .add("col5", TajoDataTypes.Type.BOOLEAN)
+        .add("col6", TajoDataTypes.Type.FLOAT4)
+        .add("col7", TajoDataTypes.Type.FLOAT8)
+        .add("col8", TajoDataTypes.Type.TEXT)
+        .add("col9", TajoDataTypes.Type.BLOB)
+        .add("col10", TajoDataTypes.Type.TIMESTAMP)
+        .add("col11", TajoDataTypes.Type.DATE)
+        .build();
 
     TableDesc table = new TableDesc(CatalogUtil.buildFQName(DB_NAME, tableName), schema, meta,
       new Path(warehousePath, new Path(DB_NAME, tableName)).toUri());

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 1c93d08..88fabe2 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
@@ -32,12 +32,12 @@ import org.apache.tajo.catalog.*;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.catalog.proto.CatalogProtos.*;
 import org.apache.tajo.common.TajoDataTypes;
-import org.apache.tajo.common.TajoDataTypes.*;
+import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.exception.*;
-import org.apache.tajo.util.JavaResourceUtil;
-import org.apache.tajo.plan.expr.*;
+import org.apache.tajo.plan.expr.AlgebraicUtil;
 import org.apache.tajo.plan.util.PartitionFilterAlgebraVisitor;
+import org.apache.tajo.util.JavaResourceUtil;
 import org.apache.tajo.util.Pair;
 
 import java.io.IOException;
@@ -2789,7 +2789,8 @@ 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(SchemaFactory.newV1(relationSchema), columnNames);
+      String unifiedName = CatalogUtil.getUnifiedSimpleColumnName(
+          SchemaBuilder.builder().addAll(relationSchema.getRootColumns()).build(), columnNames);
       pstmt.setInt(1, databaseId);
       pstmt.setInt(2, tableId);
       pstmt.setString(3, unifiedName);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 51461d1..3305801 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,10 +197,11 @@ public class CatalogTestingUtil {
   }
 
   public static TableDesc buildTableDesc(String databaseName, String tableName, String testDir) throws IOException {
-    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);
+    Schema schema = SchemaBuilder.builder()
+        .add(CatalogUtil.buildFQName(tableName, "Column"), Type.BLOB)
+        .add(CatalogUtil.buildFQName(tableName, "column"), Type.INT4)
+        .add(CatalogUtil.buildFQName(tableName, "cOlumn"), Type.INT8)
+        .build();
     Path path = new Path(testDir + "/" + UUID.randomUUID().toString(), tableName);
     TableDesc desc = new TableDesc(
         CatalogUtil.buildFQName(databaseName, tableName),
@@ -213,9 +214,10 @@ public class CatalogTestingUtil {
   }
 
   public static TableDesc buildPartitionTableDesc(String databaseName, String tableName, String testDir) throws Exception {
-    Schema partSchema = SchemaFactory.newV1();
-    partSchema.addColumn(CatalogUtil.buildFQName(tableName, "DaTe"), Type.TEXT);
-    partSchema.addColumn(CatalogUtil.buildFQName(tableName, "dAtE"), Type.TEXT);
+    Schema partSchema = SchemaBuilder.builder()
+        .add(CatalogUtil.buildFQName(tableName, "DaTe"), Type.TEXT)
+        .add(CatalogUtil.buildFQName(tableName, "dAtE"), Type.TEXT)
+        .build();
     PartitionMethodDesc partitionMethodDesc =
         new PartitionMethodDesc(DEFAULT_DATABASE_NAME, tableName,
             CatalogProtos.PartitionType.COLUMN, "id,name", partSchema);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 c64fe43..9c1e430 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,10 +181,11 @@ public class TestCatalog {
   }
 
   private TableDesc createMockupTable(String databaseName, String tableName) throws IOException {
-    schema1 = SchemaFactory.newV1();
-    schema1.addColumn(FieldName1, Type.BLOB);
-    schema1.addColumn(FieldName2, Type.INT4);
-    schema1.addColumn(FieldName3, Type.INT8);
+    schema1 = SchemaBuilder.builder()
+        .add(FieldName1, Type.BLOB)
+        .add(FieldName2, Type.INT4)
+        .add(FieldName3, Type.INT8)
+        .build();
     Path path = new Path(CommonTestingUtil.getTestDir(), tableName);
     TableDesc table = new TableDesc(
         CatalogUtil.buildFQName(databaseName, tableName),
@@ -299,10 +300,11 @@ public class TestCatalog {
 	
 	@Test
 	public void testGetTable() throws Exception {
-		schema1 = SchemaFactory.newV1();
-		schema1.addColumn(FieldName1, Type.BLOB);
-		schema1.addColumn(FieldName2, Type.INT4);
-		schema1.addColumn(FieldName3, Type.INT8);
+    schema1 = SchemaBuilder.builder()
+        .add(FieldName1, Type.BLOB)
+        .add(FieldName2, Type.INT4)
+        .add(FieldName3, Type.INT8)
+        .build();
     Path path = new Path(CommonTestingUtil.getTestDir(), "table1");
     TableDesc meta = new TableDesc(
         CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, "getTable"),
@@ -361,26 +363,22 @@ public class TestCatalog {
     //      |- s8
     //  |- s9
 
-    Schema nestedSchema = SchemaFactory.newV1();
-    nestedSchema.addColumn("s1", Type.INT8);
+    SchemaBuilder nestedSchema = SchemaBuilder.builder();
+    nestedSchema.add("s1", Type.INT8);
+    nestedSchema.add("s2", Type.INT8);
 
-    nestedSchema.addColumn("s2", Type.INT8);
+    Schema s5 = SchemaBuilder.builder().add("s6", Type.INT8).build();
+    Schema s7 = SchemaBuilder.builder().add("s5", new TypeDesc(s5)).build();
 
-    Schema s5 = SchemaFactory.newV1();
-    s5.addColumn("s6", Type.INT8);
+    Schema s3 = SchemaBuilder.builder()
+        .add("s4", Type.INT8)
+        .add("s7", new TypeDesc(s7))
+        .add("s8", Type.INT8).build();
 
-    Schema s7 = SchemaFactory.newV1();
-    s7.addColumn("s5", new TypeDesc(s5));
+    nestedSchema.add("s3", new TypeDesc(s3));
+    nestedSchema.add("s9", Type.INT8);
 
-    Schema s3 = SchemaFactory.newV1();
-    s3.addColumn("s4", Type.INT8);
-    s3.addColumn("s7", new TypeDesc(s7));
-    s3.addColumn("s8", Type.INT8);
-
-    nestedSchema.addColumn("s3", new TypeDesc(s3));
-    nestedSchema.addColumn("s9", Type.INT8);
-
-    assertSchemaEquality("nested_schema1", nestedSchema);
+    assertSchemaEquality("nested_schema1", nestedSchema.build());
   }
 
   @Test
@@ -398,26 +396,26 @@ public class TestCatalog {
     //      |- s3
     //  |- s4
 
-    Schema nestedSchema = SchemaFactory.newV1();
-    nestedSchema.addColumn("s1", Type.INT8);
-
-    nestedSchema.addColumn("s2", Type.INT8);
+    SchemaBuilder nestedSchema = SchemaBuilder.builder();
+    nestedSchema.add("s1", Type.INT8);
+    nestedSchema.add("s2", Type.INT8);
 
-    Schema s5 = SchemaFactory.newV1();
-    s5.addColumn("s6", Type.INT8);
+    Schema s5 = SchemaBuilder.builder()
+        .add("s6", Type.INT8)
+        .build();
 
-    Schema s7 = SchemaFactory.newV1();
-    s7.addColumn("s5", new TypeDesc(s5));
+    SchemaBuilder s7 = SchemaBuilder.builder();
+    s7.add("s5", new TypeDesc(s5));
 
-    Schema s3 = SchemaFactory.newV1();
-    s3.addColumn("s4", Type.INT8);
-    s3.addColumn("s7", new TypeDesc(s7));
-    s3.addColumn("s8", Type.INT8);
+    SchemaBuilder s3 = SchemaBuilder.builder();
+    s3.add("s4", Type.INT8);
+    s3.add("s7", new TypeDesc(s7.build()));
+    s3.add("s8", Type.INT8);
 
-    nestedSchema.addColumn("s3", new TypeDesc(s3));
-    nestedSchema.addColumn("s9", Type.INT8);
+    nestedSchema.add("s3", new TypeDesc(s3.build()));
+    nestedSchema.add("s9", Type.INT8);
 
-    assertSchemaEquality("nested_schema2", nestedSchema);
+    assertSchemaEquality("nested_schema2", nestedSchema.build());
   }
 
   static IndexDesc desc1;
@@ -426,11 +424,12 @@ public class TestCatalog {
   static Schema relationSchema;
 
   public static TableDesc prepareTable() throws IOException {
-    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)
-        .addColumn(DEFAULT_DATABASE_NAME + ".indexed.score", Type.FLOAT8);
+    relationSchema = SchemaBuilder.builder()
+        .add(DEFAULT_DATABASE_NAME + ".indexed.id", Type.INT4)
+        .add(DEFAULT_DATABASE_NAME + ".indexed.name", Type.TEXT)
+        .add(DEFAULT_DATABASE_NAME + ".indexed.age", Type.INT4)
+        .add(DEFAULT_DATABASE_NAME + ".indexed.score", Type.FLOAT8)
+        .build();
 
     String tableName = "indexed";
 
@@ -625,11 +624,12 @@ public class TestCatalog {
 
   @Test
   public final void testAddAndDeleteTablePartitionByHash1() throws Exception {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4)
-        .addColumn("name", Type.TEXT)
-        .addColumn("age", Type.INT4)
-        .addColumn("score", Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .add("age", Type.INT4)
+        .add("score", Type.FLOAT8)
+        .build();
 
     String tableName = CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, "addedtable");
     KeyValueSet opts = new KeyValueSet();
@@ -637,8 +637,9 @@ public class TestCatalog {
     TableMeta meta = CatalogUtil.newTableMeta("TEXT", opts);
 
 
-    Schema partSchema = SchemaFactory.newV1();
-    partSchema.addColumn("id", Type.INT4);
+    Schema partSchema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .build();
 
     PartitionMethodDesc partitionDesc =
         new PartitionMethodDesc(DEFAULT_DATABASE_NAME, tableName,
@@ -665,19 +666,21 @@ public class TestCatalog {
 
   @Test
   public final void testAddAndDeleteTablePartitionByHash2() throws Exception {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4)
-        .addColumn("name", Type.TEXT)
-        .addColumn("age", Type.INT4)
-        .addColumn("score", Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .add("age", Type.INT4)
+        .add("score", Type.FLOAT8)
+        .build();
 
     String tableName = CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, "addedtable");
     KeyValueSet opts = new KeyValueSet();
     opts.set("file.delimiter", ",");
     TableMeta meta = CatalogUtil.newTableMeta("TEXT", opts);
 
-    Schema partSchema = SchemaFactory.newV1();
-    partSchema.addColumn("id", Type.INT4);
+    Schema partSchema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .build();
     PartitionMethodDesc partitionDesc =
         new PartitionMethodDesc(DEFAULT_DATABASE_NAME, tableName,
             CatalogProtos.PartitionType.HASH, "id", partSchema);
@@ -703,19 +706,21 @@ public class TestCatalog {
 
   @Test
   public final void testAddAndDeleteTablePartitionByList() throws Exception {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4)
-        .addColumn("name", Type.TEXT)
-        .addColumn("age", Type.INT4)
-        .addColumn("score", Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .add("age", Type.INT4)
+        .add("score", Type.FLOAT8)
+        .build();
 
     String tableName = CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, "addedtable");
     KeyValueSet opts = new KeyValueSet();
     opts.set("file.delimiter", ",");
     TableMeta meta = CatalogUtil.newTableMeta("TEXT", opts);
 
-    Schema partSchema = SchemaFactory.newV1();
-    partSchema.addColumn("id", Type.INT4);
+    Schema partSchema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .build();
     PartitionMethodDesc partitionDesc =
         new PartitionMethodDesc(DEFAULT_DATABASE_NAME, tableName,
             CatalogProtos.PartitionType.LIST, "id", partSchema);
@@ -740,19 +745,21 @@ public class TestCatalog {
 
   @Test
   public final void testAddAndDeleteTablePartitionByRange() throws Exception {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4)
-        .addColumn("name", Type.TEXT)
-        .addColumn("age", Type.INT4)
-        .addColumn("score", Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .add("age", Type.INT4)
+        .add("score", Type.FLOAT8)
+        .build();
 
     String tableName = CatalogUtil.buildFQName(TajoConstants.DEFAULT_DATABASE_NAME, "addedtable");
     KeyValueSet opts = new KeyValueSet();
     opts.set("file.delimiter", ",");
     TableMeta meta = CatalogUtil.newTableMeta("TEXT", opts);
 
-    Schema partSchema = SchemaFactory.newV1();
-    partSchema.addColumn("id", Type.INT4);
+    Schema partSchema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .build();
     PartitionMethodDesc partitionDesc =
         new PartitionMethodDesc(DEFAULT_DATABASE_NAME, tableName, CatalogProtos.PartitionType.RANGE,
             "id", partSchema);
@@ -777,11 +784,12 @@ public class TestCatalog {
 
   // TODO: This should be added at TAJO-1891
   public final void testAddAndDeleteTablePartitionByColumn() throws Exception {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4)
-        .addColumn("name", Type.TEXT)
-        .addColumn("age", Type.INT4)
-        .addColumn("score", Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .add("age", Type.INT4)
+        .add("score", Type.FLOAT8)
+        .build();
 
     String simpleTableName = "addedtable";
     String tableName = CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, simpleTableName);
@@ -789,9 +797,10 @@ public class TestCatalog {
     opts.set("file.delimiter", ",");
     TableMeta meta = CatalogUtil.newTableMeta("TEXT", opts);
 
-    Schema partSchema = SchemaFactory.newV1();
-    partSchema.addColumn("id", Type.INT4);
-    partSchema.addColumn("name", Type.TEXT);
+    Schema partSchema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .build();
 
     PartitionMethodDesc partitionMethodDesc =
         new PartitionMethodDesc(DEFAULT_DATABASE_NAME, tableName,


[3/6] tajo git commit: TAJO-2108: Refactor Schema to be immutable.

Posted by hy...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 ece17c7..f57f5f2 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.DatumFactory;
@@ -39,8 +39,9 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForINT2Asc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.INT2);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.INT2)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -69,8 +70,9 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForINT2Desc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.INT2);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.INT2)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
     sortSpecs[0].setDescOrder();
@@ -100,8 +102,9 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForINT4Asc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.INT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.INT4)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -130,8 +133,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForINT4Desc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.INT4);
+    Schema schema = SchemaBuilder.builder().add("col1", Type.INT4).build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
     sortSpecs[0].setDescOrder();
@@ -161,8 +163,8 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForINT8Asc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.INT8).build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -191,8 +193,9 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForInt8Desc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.INT8)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
     sortSpecs[0].setDescOrder();
@@ -222,8 +225,9 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForFloat4Asc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.FLOAT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.FLOAT4)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -252,8 +256,9 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForFloat4Desc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.FLOAT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.FLOAT4)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
     sortSpecs[0].setDescOrder();
@@ -283,8 +288,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForFloat8Asc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder().add("col1", Type.FLOAT8).build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -313,8 +317,9 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForFloat8Desc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.FLOAT8)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
     sortSpecs[0].setDescOrder();
@@ -347,9 +352,10 @@ public class TestUniformRangePartition {
    */
   @Test
   public void testIncrementOfText() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("l_returnflag", Type.TEXT)
-        .addColumn("l_linestatus", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("l_returnflag", Type.TEXT)
+        .add("l_linestatus", Type.TEXT)
+        .build();
 
     SortSpec[] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -394,9 +400,10 @@ public class TestUniformRangePartition {
    */
   @Test
   public void testIncrementOfText2() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("l_returnflag", Type.TEXT)
-        .addColumn("l_linestatus", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("l_returnflag", Type.TEXT)
+        .add("l_linestatus", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -439,10 +446,11 @@ public class TestUniformRangePartition {
    */
   @Test
   public void testIncrementOfText3() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("l_returnflag", Type.TEXT)
-        .addColumn("l_linestatus", Type.TEXT)
-        .addColumn("final", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("l_returnflag", Type.TEXT)
+        .add("l_linestatus", Type.TEXT)
+        .add("final", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -472,8 +480,9 @@ public class TestUniformRangePartition {
 
   @Test
   public void testIncrementOfUnicode() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -500,8 +509,9 @@ public class TestUniformRangePartition {
 
   @Test
   public void testIncrementOfUnicodeOneCharSinglePartition() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -530,8 +540,8 @@ public class TestUniformRangePartition {
 
   @Test
   public void testIncrementOfUnicodeOneCharMultiPartition() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.TEXT).build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -560,8 +570,9 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForUnicodeTextAsc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -590,9 +601,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForUnicodeDiffLenBeginTextAsc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.TEXT);
-
+    Schema schema = SchemaBuilder.builder().add("col1", Type.TEXT).build();
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
     VTuple s = new VTuple(1);
@@ -620,8 +629,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForUnicodeDiffLenEndTextAsc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.TEXT);
+    Schema schema = SchemaBuilder.builder().add("col1", Type.TEXT).build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -650,8 +658,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForUnicodeTextDesc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.TEXT);
+    Schema schema = SchemaBuilder.builder().add("col1", Type.TEXT).build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
     sortSpecs[0].setDescOrder();
@@ -681,8 +688,7 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForUnicodeDiffLenBeginTextDesc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.TEXT);
+    Schema schema = SchemaBuilder.builder().add("col1", Type.TEXT).build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
     sortSpecs[0].setDescOrder();
@@ -712,8 +718,9 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForUnicodeDiffLenEndTextDesc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("col1", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
     sortSpecs[0].setDescOrder();
@@ -743,9 +750,10 @@ public class TestUniformRangePartition {
 
   @Test
   public void testIncrementOfInt8() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("l_orderkey", Type.INT8)
-        .addColumn("l_linenumber", Type.INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("l_orderkey", Type.INT8)
+        .add("l_linenumber", Type.INT8)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -770,10 +778,11 @@ public class TestUniformRangePartition {
   }
 
   @Test public void testIncrementOfInt8AndFinal() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("l_orderkey", Type.INT8)
-        .addColumn("l_linenumber", Type.INT8)
-        .addColumn("final", Type.INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("l_orderkey", Type.INT8)
+        .add("l_linenumber", Type.INT8)
+        .add("final", Type.INT8)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -803,10 +812,11 @@ public class TestUniformRangePartition {
 
   @Test
   public void testIncrementOfFloat8() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("l_orderkey", Type.FLOAT8)
-        .addColumn("l_linenumber", Type.FLOAT8)
-        .addColumn("final", Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("l_orderkey", Type.FLOAT8)
+        .add("l_linenumber", Type.FLOAT8)
+        .add("final", Type.FLOAT8)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -836,10 +846,11 @@ public class TestUniformRangePartition {
 
   @Test
   public void testIncrementOfInet4() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("l_orderkey", Type.INET4)
-        .addColumn("l_linenumber", Type.INET4)
-        .addColumn("final", Type.INET4);
+    Schema schema = SchemaBuilder.builder()
+        .add("l_orderkey", Type.INET4)
+        .add("l_linenumber", Type.INET4)
+        .add("final", Type.INET4)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -869,9 +880,10 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartition() {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("l_returnflag", Type.TEXT);
-    schema.addColumn("l_linestatus", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("l_returnflag", Type.TEXT)
+        .add("l_linestatus", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -898,9 +910,10 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForOnePartNum() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("l_returnflag", Type.TEXT)
-        .addColumn("l_linestatus", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("l_returnflag", Type.TEXT)
+        .add("l_linestatus", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -920,9 +933,10 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForOnePartNumWithOneOfTheValueNull() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("l_returnflag", Type.TEXT)
-        .addColumn("l_linestatus", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("l_returnflag", Type.TEXT)
+        .add("l_linestatus", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -942,8 +956,8 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForMultipleChars() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("KEY1", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("KEY1", Type.TEXT).build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -971,8 +985,10 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForMultipleChars2() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("KEY1", Type.TEXT);
+    Schema schema = SchemaBuilder
+        .builder()
+        .add("KEY1", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -1002,8 +1018,9 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForMultipleChars2Desc() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("KEY1", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("KEY1", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
     sortSpecs[0].setDescOrder();
@@ -1034,8 +1051,9 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForMultipleCharsWithSameFirstChar() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("KEY1", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("KEY1", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -1065,9 +1083,10 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionForOnePartNumWithBothValueNull() {
-    Schema schema = SchemaFactory.newV1()
-        .addColumn("l_returnflag", Type.TEXT)
-        .addColumn("l_linestatus", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("l_returnflag", Type.TEXT)
+        .add("l_linestatus", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -1087,9 +1106,10 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionWithNull() {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("l_returnflag", Type.TEXT);
-    schema.addColumn("l_linestatus", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("l_returnflag", Type.TEXT)
+        .add("l_linestatus", Type.TEXT)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
@@ -1116,9 +1136,10 @@ public class TestUniformRangePartition {
 
   @Test
   public void testPartitionWithINET4() {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("l_returnflag", Type.INET4);
-    schema.addColumn("l_linestatus", Type.INET4);
+    Schema schema = SchemaBuilder.builder()
+        .add("l_returnflag", Type.INET4)
+        .add("l_linestatus", Type.INET4)
+        .build();
 
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 788ebeb..d2d7810 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
@@ -103,7 +103,7 @@ public class TestExternalSortExec {
     catalog.createDatabase(TajoConstants.DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf.setVar(TajoConf.ConfVars.WORKER_TEMPORAL_DIR, testDir.toString());
 
-    tableSchema = SchemaFactory.newV1(new Column[] {
+    tableSchema = SchemaBuilder.builder().addAll(new Column[] {
         new Column("managerid", Type.INT8),
         new Column("empid", Type.INT4),
         new Column("deptname", Type.TEXT),
@@ -119,7 +119,7 @@ public class TestExternalSortExec {
         new Column("col10", Type.INT8),
         new Column("col11", Type.INT8),
         new Column("col12", Type.INT8)
-    });
+    }).build();
 
     TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
     Path employeePath = new Path(testDir, "employee.csv");
@@ -215,10 +215,10 @@ public class TestExternalSortExec {
     Tuple curVal;
     int cnt = 0;
     exec.init();
-    Schema sortSchema = SchemaFactory.newV1(new Column[] {
+    Schema sortSchema = SchemaBuilder.builder().addAll(new Column[] {
         new Column("managerid", Type.INT8),
         new Column("empid", Type.INT4),
-    });
+    }).build();
 
     BaseTupleComparator comparator = new BaseTupleComparator(sortSchema,
         new SortSpec[]{

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 40dc373..1d2e6b5 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
@@ -27,12 +27,12 @@ import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.planner.PhysicalPlanner;
 import org.apache.tajo.engine.planner.PhysicalPlannerImpl;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalPlanner;
 import org.apache.tajo.plan.logical.JoinNode;
 import org.apache.tajo.plan.logical.LogicalNode;
@@ -101,10 +101,11 @@ public class TestFullOuterHashJoinExec {
     //  7     | dep_7     | 1007
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
-    Schema dep3Schema = SchemaFactory.newV1();
-    dep3Schema.addColumn("dep_id", Type.INT4);
-    dep3Schema.addColumn("dep_name", Type.TEXT);
-    dep3Schema.addColumn("loc_id", Type.INT4);
+    Schema dep3Schema = SchemaBuilder.builder()
+        .add("dep_id", Type.INT4)
+        .add("dep_name", Type.TEXT)
+        .add("loc_id", Type.INT4)
+        .build();
 
 
     TableMeta dep3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -131,9 +132,10 @@ public class TestFullOuterHashJoinExec {
     //   102    |  job_102
     //   103    |  job_103
 
-    Schema job3Schema = SchemaFactory.newV1();
-    job3Schema.addColumn("job_id", Type.INT4);
-    job3Schema.addColumn("job_title", Type.TEXT);
+    Schema job3Schema = SchemaBuilder.builder()
+        .add("job_id", Type.INT4)
+        .add("job_title", Type.TEXT)
+        .build();
 
 
     TableMeta job3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -166,13 +168,14 @@ public class TestFullOuterHashJoinExec {
     //  21     |  fn_21     |  ln_21    |  1     | 123    | 101
     //  23     |  fn_23     |  ln_23    |  3     | 369    | 103
 
-    Schema emp3Schema = SchemaFactory.newV1();
-    emp3Schema.addColumn("emp_id", Type.INT4);
-    emp3Schema.addColumn("first_name", Type.TEXT);
-    emp3Schema.addColumn("last_name", Type.TEXT);
-    emp3Schema.addColumn("dep_id", Type.INT4);
-    emp3Schema.addColumn("salary", Type.FLOAT4);
-    emp3Schema.addColumn("job_id", Type.INT4);
+    Schema emp3Schema = SchemaBuilder.builder()
+        .add("emp_id", Type.INT4)
+        .add("first_name", Type.TEXT)
+        .add("last_name", Type.TEXT)
+        .add("dep_id", Type.INT4)
+        .add("salary", Type.FLOAT4)
+        .add("job_id", Type.INT4)
+        .build();
 
 
     TableMeta emp3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -222,9 +225,10 @@ public class TestFullOuterHashJoinExec {
     // -----------------------------------------------
     // this table is empty, no rows
 
-    Schema phone3Schema = SchemaFactory.newV1();
-    phone3Schema.addColumn("emp_id", Type.INT4);
-    phone3Schema.addColumn("phone_number", Type.TEXT);
+    Schema phone3Schema = SchemaBuilder.builder()
+        .add("emp_id", Type.INT4)
+        .add("phone_number", Type.TEXT)
+        .build();
 
 
     TableMeta phone3Meta = CatalogUtil.newTableMeta("TEXT");

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 9c426ad..0fb7bbb 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
@@ -28,12 +28,12 @@ import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.planner.PhysicalPlanner;
 import org.apache.tajo.engine.planner.PhysicalPlannerImpl;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalPlanner;
 import org.apache.tajo.plan.logical.JoinNode;
 import org.apache.tajo.plan.logical.LogicalNode;
@@ -105,10 +105,11 @@ public class TestFullOuterMergeJoinExec {
     //  7     | dep_7     | 1007
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
-    Schema dep3Schema = SchemaFactory.newV1();
-    dep3Schema.addColumn("dep_id", Type.INT4);
-    dep3Schema.addColumn("dep_name", Type.TEXT);
-    dep3Schema.addColumn("loc_id", Type.INT4);
+    Schema dep3Schema = SchemaBuilder.builder()
+        .add("dep_id", Type.INT4)
+        .add("dep_name", Type.TEXT)
+        .add("loc_id", Type.INT4)
+        .build();
 
 
     TableMeta dep3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -143,10 +144,11 @@ public class TestFullOuterMergeJoinExec {
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
     // 10     | dep_10    | 1010
-    Schema dep4Schema = SchemaFactory.newV1();
-    dep4Schema.addColumn("dep_id", Type.INT4);
-    dep4Schema.addColumn("dep_name", Type.TEXT);
-    dep4Schema.addColumn("loc_id", Type.INT4);
+    Schema dep4Schema = SchemaBuilder.builder()
+        .add("dep_id", Type.INT4)
+        .add("dep_name", Type.TEXT)
+        .add("loc_id", Type.INT4)
+        .build();
 
 
     TableMeta dep4Meta = CatalogUtil.newTableMeta("TEXT");
@@ -175,9 +177,10 @@ public class TestFullOuterMergeJoinExec {
     //   102    |  job_102
     //   103    |  job_103
 
-    Schema job3Schema = SchemaFactory.newV1();
-    job3Schema.addColumn("job_id", Type.INT4);
-    job3Schema.addColumn("job_title", Type.TEXT);
+    Schema job3Schema = SchemaBuilder.builder()
+        .add("job_id", Type.INT4)
+        .add("job_title", Type.TEXT)
+        .build();
 
 
     TableMeta job3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -210,13 +213,14 @@ public class TestFullOuterMergeJoinExec {
     //  21     |  fn_21     |  ln_21    |  1     | 123    | 101
     //  23     |  fn_23     |  ln_23    |  3     | 369    | 103
 
-    Schema emp3Schema = SchemaFactory.newV1();
-    emp3Schema.addColumn("emp_id", Type.INT4);
-    emp3Schema.addColumn("first_name", Type.TEXT);
-    emp3Schema.addColumn("last_name", Type.TEXT);
-    emp3Schema.addColumn("dep_id", Type.INT4);
-    emp3Schema.addColumn("salary", Type.FLOAT4);
-    emp3Schema.addColumn("job_id", Type.INT4);
+    Schema emp3Schema = SchemaBuilder.builder()
+        .add("emp_id", Type.INT4)
+        .add("first_name", Type.TEXT)
+        .add("last_name", Type.TEXT)
+        .add("dep_id", Type.INT4)
+        .add("salary", Type.FLOAT4)
+        .add("job_id", Type.INT4)
+        .build();
 
 
     TableMeta emp3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -266,9 +270,10 @@ public class TestFullOuterMergeJoinExec {
     // -----------------------------------------------
     // this table is empty, no rows
 
-    Schema phone3Schema = SchemaFactory.newV1();
-    phone3Schema.addColumn("emp_id", Type.INT4);
-    phone3Schema.addColumn("phone_number", Type.TEXT);
+    Schema phone3Schema = SchemaBuilder.builder()
+        .add("emp_id", Type.INT4)
+        .add("phone_number", Type.TEXT)
+        .build();
 
 
     TableMeta phone3Meta = CatalogUtil.newTableMeta("TEXT");

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 f4257f1..cd04ea0 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
@@ -27,12 +27,12 @@ import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.planner.PhysicalPlanner;
 import org.apache.tajo.engine.planner.PhysicalPlannerImpl;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalOptimizer;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.LogicalPlanner;
@@ -78,11 +78,12 @@ public class TestHashAntiJoinExec {
     catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf = util.getConfiguration();
 
-    Schema employeeSchema = SchemaFactory.newV1();
-    employeeSchema.addColumn("managerid", Type.INT4);
-    employeeSchema.addColumn("empid", Type.INT4);
-    employeeSchema.addColumn("memid", Type.INT4);
-    employeeSchema.addColumn("deptname", Type.TEXT);
+    Schema employeeSchema = SchemaBuilder.builder()
+        .add("managerid", Type.INT4)
+        .add("empid", Type.INT4)
+        .add("memid", Type.INT4)
+        .add("deptname", Type.TEXT)
+        .build();
 
     TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
     Path employeePath = new Path(testDir, "employee.csv");
@@ -105,11 +106,12 @@ public class TestHashAntiJoinExec {
     employee = CatalogUtil.newTableDesc("default.employee", employeeSchema, employeeMeta, employeePath);
     catalog.createTable(employee);
 
-    Schema peopleSchema = SchemaFactory.newV1();
-    peopleSchema.addColumn("empid", Type.INT4);
-    peopleSchema.addColumn("fk_memid", Type.INT4);
-    peopleSchema.addColumn("name", Type.TEXT);
-    peopleSchema.addColumn("age", Type.INT4);
+    Schema peopleSchema = SchemaBuilder.builder()
+        .add("empid", Type.INT4)
+        .add("fk_memid", Type.INT4)
+        .add("name", Type.TEXT)
+        .add("age", Type.INT4)
+        .build();
     TableMeta peopleMeta = CatalogUtil.newTableMeta("TEXT");
     Path peoplePath = new Path(testDir, "people.csv");
     appender = ((FileTablespace) TablespaceManager.getLocalFs())

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 0731d9c..cdf9068 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
@@ -29,12 +29,12 @@ import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.planner.PhysicalPlanner;
 import org.apache.tajo.engine.planner.PhysicalPlannerImpl;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalPlanner;
 import org.apache.tajo.plan.logical.JoinNode;
 import org.apache.tajo.plan.logical.LogicalNode;
@@ -80,11 +80,12 @@ public class TestHashJoinExec {
     catalog.createDatabase(TajoConstants.DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf = util.getConfiguration();
 
-    Schema employeeSchema = SchemaFactory.newV1();
-    employeeSchema.addColumn("managerid", Type.INT4);
-    employeeSchema.addColumn("empid", Type.INT4);
-    employeeSchema.addColumn("memid", Type.INT4);
-    employeeSchema.addColumn("deptname", Type.TEXT);
+    Schema employeeSchema = SchemaBuilder.builder()
+        .add("managerid", Type.INT4)
+        .add("empid", Type.INT4)
+        .add("memid", Type.INT4)
+        .add("deptname", Type.TEXT)
+        .build();
 
     TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
     Path employeePath = new Path(testDir, "employee.csv");
@@ -104,11 +105,12 @@ public class TestHashJoinExec {
     employee = CatalogUtil.newTableDesc("default.employee", employeeSchema, employeeMeta, employeePath);
     catalog.createTable(employee);
 
-    Schema peopleSchema = SchemaFactory.newV1();
-    peopleSchema.addColumn("empid", Type.INT4);
-    peopleSchema.addColumn("fk_memid", Type.INT4);
-    peopleSchema.addColumn("name", Type.TEXT);
-    peopleSchema.addColumn("age", Type.INT4);
+    Schema peopleSchema = SchemaBuilder.builder()
+        .add("empid", Type.INT4)
+        .add("fk_memid", Type.INT4)
+        .add("name", Type.TEXT)
+        .add("age", Type.INT4)
+        .build();
     TableMeta peopleMeta = CatalogUtil.newTableMeta("TEXT");
     Path peoplePath = new Path(testDir, "people.csv");
     appender = ((FileTablespace) TablespaceManager.getLocalFs())

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 5244652..026bbe2 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
@@ -27,12 +27,12 @@ import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.planner.PhysicalPlanner;
 import org.apache.tajo.engine.planner.PhysicalPlannerImpl;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalOptimizer;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.LogicalPlanner;
@@ -78,11 +78,12 @@ public class TestHashSemiJoinExec {
     catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf = util.getConfiguration();
 
-    Schema employeeSchema = SchemaFactory.newV1();
-    employeeSchema.addColumn("managerid", Type.INT4);
-    employeeSchema.addColumn("empid", Type.INT4);
-    employeeSchema.addColumn("memid", Type.INT4);
-    employeeSchema.addColumn("deptname", Type.TEXT);
+    Schema employeeSchema = SchemaBuilder.builder()
+        .add("managerid", Type.INT4)
+        .add("empid", Type.INT4)
+        .add("memid", Type.INT4)
+        .add("deptname", Type.TEXT)
+        .build();
 
     TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
     Path employeePath = new Path(testDir, "employee.csv");
@@ -105,11 +106,12 @@ public class TestHashSemiJoinExec {
     employee = CatalogUtil.newTableDesc("default.employee", employeeSchema, employeeMeta, employeePath);
     catalog.createTable(employee);
 
-    Schema peopleSchema = SchemaFactory.newV1();
-    peopleSchema.addColumn("empid", Type.INT4);
-    peopleSchema.addColumn("fk_memid", Type.INT4);
-    peopleSchema.addColumn("name", Type.TEXT);
-    peopleSchema.addColumn("age", Type.INT4);
+    Schema peopleSchema = SchemaBuilder.builder()
+        .add("empid", Type.INT4)
+        .add("fk_memid", Type.INT4)
+        .add("name", Type.TEXT)
+        .add("age", Type.INT4)
+        .build();
     TableMeta peopleMeta = CatalogUtil.newTableMeta("TEXT");
     Path peoplePath = new Path(testDir, "people.csv");
     appender = ((FileTablespace) TablespaceManager.getLocalFs())

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 61ccd00..c308065 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
@@ -27,12 +27,12 @@ import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.planner.PhysicalPlanner;
 import org.apache.tajo.engine.planner.PhysicalPlannerImpl;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalPlanner;
 import org.apache.tajo.plan.logical.JoinNode;
 import org.apache.tajo.plan.logical.LogicalNode;
@@ -99,10 +99,11 @@ public class TestLeftOuterHashJoinExec {
     //  7     | dep_7     | 1007
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
-    Schema dep3Schema = SchemaFactory.newV1();
-    dep3Schema.addColumn("dep_id", Type.INT4);
-    dep3Schema.addColumn("dep_name", Type.TEXT);
-    dep3Schema.addColumn("loc_id", Type.INT4);
+    Schema dep3Schema = SchemaBuilder.builder()
+    .add("dep_id", Type.INT4)
+    .add("dep_name", Type.TEXT)
+    .add("loc_id", Type.INT4)
+        .build();
 
 
     TableMeta dep3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -129,9 +130,10 @@ public class TestLeftOuterHashJoinExec {
     //   102    |  job_102
     //   103    |  job_103
 
-    Schema job3Schema = SchemaFactory.newV1();
-    job3Schema.addColumn("job_id", Type.INT4);
-    job3Schema.addColumn("job_title", Type.TEXT);
+    Schema job3Schema = SchemaBuilder.builder()
+        .add("job_id", Type.INT4)
+        .add("job_title", Type.TEXT)
+        .build();
 
 
     TableMeta job3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -165,13 +167,14 @@ public class TestLeftOuterHashJoinExec {
     //  21     |  fn_21     |  ln_21    |  1     | 123    | 101
     //  23     |  fn_23     |  ln_23    |  3     | 369    | 103
 
-    Schema emp3Schema = SchemaFactory.newV1();
-    emp3Schema.addColumn("emp_id", Type.INT4);
-    emp3Schema.addColumn("first_name", Type.TEXT);
-    emp3Schema.addColumn("last_name", Type.TEXT);
-    emp3Schema.addColumn("dep_id", Type.INT4);
-    emp3Schema.addColumn("salary", Type.FLOAT4);
-    emp3Schema.addColumn("job_id", Type.INT4);
+    Schema emp3Schema = SchemaBuilder.builder()
+        .add("emp_id", Type.INT4)
+        .add("first_name", Type.TEXT)
+        .add("last_name", Type.TEXT)
+        .add("dep_id", Type.INT4)
+        .add("salary", Type.FLOAT4)
+        .add("job_id", Type.INT4)
+        .build();
 
 
     TableMeta emp3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -222,9 +225,10 @@ public class TestLeftOuterHashJoinExec {
     // -----------------------------------------------
     // this table is empty, no rows
 
-    Schema phone3Schema = SchemaFactory.newV1();
-    phone3Schema.addColumn("emp_id", Type.INT4);
-    phone3Schema.addColumn("phone_number", Type.TEXT);
+    Schema phone3Schema = SchemaBuilder.builder()
+        .add("emp_id", Type.INT4)
+        .add("phone_number", Type.TEXT)
+        .build();
 
 
     TableMeta phone3Meta = CatalogUtil.newTableMeta("TEXT");

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 88018e9..5819003 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
@@ -28,12 +28,12 @@ import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.planner.PhysicalPlanner;
 import org.apache.tajo.engine.planner.PhysicalPlannerImpl;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.LogicalPlanner;
 import org.apache.tajo.plan.logical.JoinNode;
@@ -78,11 +78,12 @@ public class TestMergeJoinExec {
     catalog.createDatabase(TajoConstants.DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf = util.getConfiguration();
 
-    Schema employeeSchema = SchemaFactory.newV1();
-    employeeSchema.addColumn("managerid", Type.INT4);
-    employeeSchema.addColumn("empid", Type.INT4);
-    employeeSchema.addColumn("memid", Type.INT4);
-    employeeSchema.addColumn("deptname", Type.TEXT);
+    Schema employeeSchema = SchemaBuilder.builder()
+        .add("managerid", Type.INT4)
+        .add("empid", Type.INT4)
+        .add("memid", Type.INT4)
+        .add("deptname", Type.TEXT)
+        .build();
 
     TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
     Path employeePath = new Path(testDir, "employee.csv");
@@ -108,11 +109,12 @@ public class TestMergeJoinExec {
     employee = CatalogUtil.newTableDesc("default.employee", employeeSchema, employeeMeta, employeePath);
     catalog.createTable(employee);
 
-    Schema peopleSchema = SchemaFactory.newV1();
-    peopleSchema.addColumn("empid", Type.INT4);
-    peopleSchema.addColumn("fk_memid", Type.INT4);
-    peopleSchema.addColumn("name", Type.TEXT);
-    peopleSchema.addColumn("age", Type.INT4);
+    Schema peopleSchema = SchemaBuilder.builder()
+        .add("empid", Type.INT4)
+        .add("fk_memid", Type.INT4)
+        .add("name", Type.TEXT)
+        .add("age", Type.INT4)
+        .build();
     TableMeta peopleMeta = CatalogUtil.newTableMeta("TEXT");
     Path peoplePath = new Path(testDir, "people.csv");
     appender = ((FileTablespace) TablespaceManager.getLocalFs())

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 28d99b1..694193d 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,16 +104,18 @@ public class TestPhysicalPlanner {
       catalog.createFunction(funcDesc);
     }
 
-    Schema employeeSchema = SchemaFactory.newV1();
-    employeeSchema.addColumn("name", Type.TEXT);
-    employeeSchema.addColumn("empid", Type.INT4);
-    employeeSchema.addColumn("deptname", Type.TEXT);
-
-    Schema scoreSchema = SchemaFactory.newV1();
-    scoreSchema.addColumn("deptname", Type.TEXT);
-    scoreSchema.addColumn("class", Type.TEXT);
-    scoreSchema.addColumn("score", Type.INT4);
-    scoreSchema.addColumn("nullable", Type.TEXT);
+    Schema employeeSchema = SchemaBuilder.builder()
+        .add("name", Type.TEXT)
+        .add("empid", Type.INT4)
+        .add("deptname", Type.TEXT)
+        .build();
+
+    Schema scoreSchema = SchemaBuilder.builder()
+        .add("deptname", Type.TEXT)
+        .add("class", Type.TEXT)
+        .add("score", Type.INT4)
+        .add("nullable", Type.TEXT)
+        .build();
 
     TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 21a08bd..eeb179f 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,10 +80,11 @@ public class TestProgressExternalSortExec {
     catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf.setVar(TajoConf.ConfVars.WORKER_TEMPORAL_DIR, testDir.toString());
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("managerid", TajoDataTypes.Type.INT4);
-    schema.addColumn("empid", TajoDataTypes.Type.INT4);
-    schema.addColumn("deptname", TajoDataTypes.Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("managerid", TajoDataTypes.Type.INT4)
+        .add("empid", TajoDataTypes.Type.INT4)
+        .add("deptname", TajoDataTypes.Type.TEXT)
+        .build();
 
     TableMeta employeeMeta = CatalogUtil.newTableMeta(BuiltinStorages.RAW);
     Path employeePath = new Path(testDir, "employee.raw");

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRadixSort.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRadixSort.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRadixSort.java
index 8246834..f357379 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRadixSort.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/planner/physical/TestRadixSort.java
@@ -21,7 +21,7 @@ package org.apache.tajo.engine.planner.physical;
 import org.apache.tajo.SessionVars;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.SchemaFactory;
+import org.apache.tajo.catalog.SchemaBuilder;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -63,7 +63,7 @@ public class TestRadixSort {
     queryContext = new QueryContext(new TajoConf());
     queryContext.setInt(SessionVars.TEST_TIM_SORT_THRESHOLD_FOR_RADIX_SORT, 0);
 
-    schema = SchemaFactory.newV1(new Column[]{
+    schema = SchemaBuilder.builder().addAll(new Column[]{
         new Column("col0", Type.INT8),
         new Column("col1", Type.INT4),
         new Column("col2", Type.INT2),
@@ -73,7 +73,7 @@ public class TestRadixSort {
         new Column("col6", Type.INET4),
         new Column("col7", Type.FLOAT4),
         new Column("col8", Type.FLOAT8)
-    });
+    }).build();
   }
 
   private static class Param {

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 a5c54b8..83d26c7 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
@@ -27,12 +27,12 @@ import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.planner.PhysicalPlanner;
 import org.apache.tajo.engine.planner.PhysicalPlannerImpl;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalPlanner;
 import org.apache.tajo.plan.logical.LogicalNode;
 import org.apache.tajo.storage.*;
@@ -93,10 +93,11 @@ public class TestRightOuterHashJoinExec {
     //  7     | dep_7     | 1007
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
-    Schema dep3Schema = SchemaFactory.newV1();
-    dep3Schema.addColumn("dep_id", Type.INT4);
-    dep3Schema.addColumn("dep_name", Type.TEXT);
-    dep3Schema.addColumn("loc_id", Type.INT4);
+    Schema dep3Schema = SchemaBuilder.builder()
+        .add("dep_id", Type.INT4)
+        .add("dep_name", Type.TEXT)
+        .add("loc_id", Type.INT4)
+        .build();
 
 
     TableMeta dep3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -124,9 +125,10 @@ public class TestRightOuterHashJoinExec {
     //   102    |  job_102
     //   103    |  job_103
 
-    Schema job3Schema = SchemaFactory.newV1();
-    job3Schema.addColumn("job_id", Type.INT4);
-    job3Schema.addColumn("job_title", Type.TEXT);
+    Schema job3Schema = SchemaBuilder.builder()
+        .add("job_id", Type.INT4)
+        .add("job_title", Type.TEXT)
+        .build();
 
 
     TableMeta job3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -160,13 +162,14 @@ public class TestRightOuterHashJoinExec {
     //  21     |  fn_21     |  ln_21    |  1     | 123    | 101
     //  23     |  fn_23     |  ln_23    |  3     | 369    | 103
 
-    Schema emp3Schema = SchemaFactory.newV1();
-    emp3Schema.addColumn("emp_id", Type.INT4);
-    emp3Schema.addColumn("first_name", Type.TEXT);
-    emp3Schema.addColumn("last_name", Type.TEXT);
-    emp3Schema.addColumn("dep_id", Type.INT4);
-    emp3Schema.addColumn("salary", Type.FLOAT4);
-    emp3Schema.addColumn("job_id", Type.INT4);
+    Schema emp3Schema = SchemaBuilder.builder()
+        .add("emp_id", Type.INT4)
+        .add("first_name", Type.TEXT)
+        .add("last_name", Type.TEXT)
+        .add("dep_id", Type.INT4)
+        .add("salary", Type.FLOAT4)
+        .add("job_id", Type.INT4)
+        .build();
 
 
     TableMeta emp3Meta = CatalogUtil.newTableMeta("TEXT");

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 22946e9..4bfe0f7 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
@@ -27,12 +27,12 @@ import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.planner.PhysicalPlanner;
 import org.apache.tajo.engine.planner.PhysicalPlannerImpl;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalPlanner;
 import org.apache.tajo.plan.logical.JoinNode;
 import org.apache.tajo.plan.logical.LogicalNode;
@@ -104,10 +104,11 @@ public class TestRightOuterMergeJoinExec {
     //  7     | dep_7     | 1007
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
-    Schema dep3Schema = SchemaFactory.newV1();
-    dep3Schema.addColumn("dep_id", Type.INT4);
-    dep3Schema.addColumn("dep_name", Type.TEXT);
-    dep3Schema.addColumn("loc_id", Type.INT4);
+    Schema dep3Schema = SchemaBuilder.builder()
+        .add("dep_id", Type.INT4)
+        .add("dep_name", Type.TEXT)
+        .add("loc_id", Type.INT4)
+        .build();
 
 
     TableMeta dep3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -143,10 +144,11 @@ public class TestRightOuterMergeJoinExec {
     //  8     | dep_8     | 1008
     //  9     | dep_9     | 1009
     // 10     | dep_10    | 1010
-    Schema dep4Schema = SchemaFactory.newV1();
-    dep4Schema.addColumn("dep_id", Type.INT4);
-    dep4Schema.addColumn("dep_name", Type.TEXT);
-    dep4Schema.addColumn("loc_id", Type.INT4);
+    Schema dep4Schema = SchemaBuilder.builder()
+        .add("dep_id", Type.INT4)
+        .add("dep_name", Type.TEXT)
+        .add("loc_id", Type.INT4)
+        .build();
 
 
     TableMeta dep4Meta = CatalogUtil.newTableMeta("TEXT");
@@ -176,9 +178,10 @@ public class TestRightOuterMergeJoinExec {
     //   102    |  job_102
     //   103    |  job_103
 
-    Schema job3Schema = SchemaFactory.newV1();
-    job3Schema.addColumn("job_id", Type.INT4);
-    job3Schema.addColumn("job_title", Type.TEXT);
+    Schema job3Schema = SchemaBuilder.builder()
+        .add("job_id", Type.INT4)
+        .add("job_title", Type.TEXT)
+        .build();
 
 
     TableMeta job3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -212,13 +215,14 @@ public class TestRightOuterMergeJoinExec {
     //  21     |  fn_21     |  ln_21    |  1     | 123    | 101
     //  23     |  fn_23     |  ln_23    |  3     | 369    | 103
 
-    Schema emp3Schema = SchemaFactory.newV1();
-    emp3Schema.addColumn("emp_id", Type.INT4);
-    emp3Schema.addColumn("first_name", Type.TEXT);
-    emp3Schema.addColumn("last_name", Type.TEXT);
-    emp3Schema.addColumn("dep_id", Type.INT4);
-    emp3Schema.addColumn("salary", Type.FLOAT4);
-    emp3Schema.addColumn("job_id", Type.INT4);
+    Schema emp3Schema = SchemaBuilder.builder()
+        .add("emp_id", Type.INT4)
+        .add("first_name", Type.TEXT)
+        .add("last_name", Type.TEXT)
+        .add("dep_id", Type.INT4)
+        .add("salary", Type.FLOAT4)
+        .add("job_id", Type.INT4)
+        .build();
 
 
     TableMeta emp3Meta = CatalogUtil.newTableMeta("TEXT");
@@ -269,10 +273,10 @@ public class TestRightOuterMergeJoinExec {
     // -----------------------------------------------
     // this table is empty, no rows
 
-    Schema phone3Schema = SchemaFactory.newV1();
-    phone3Schema.addColumn("emp_id", Type.INT4);
-    phone3Schema.addColumn("phone_number", Type.TEXT);
-
+    Schema phone3Schema = SchemaBuilder.builder()
+        .add("emp_id", Type.INT4)
+        .add("phone_number", Type.TEXT)
+        .build();
 
     TableMeta phone3Meta = CatalogUtil.newTableMeta("TEXT");
     Path phone3Path = new Path(testDir, "phone3.csv");

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 43cc719..07b392a 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
@@ -30,7 +30,6 @@ import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.conf.TajoConf.ConfVars;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.planner.PhysicalPlanner;
 import org.apache.tajo.engine.planner.PhysicalPlannerImpl;
 import org.apache.tajo.engine.planner.RangePartitionAlgorithm;
@@ -38,6 +37,7 @@ import org.apache.tajo.engine.planner.UniformRangePartition;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalOptimizer;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.LogicalPlanner;
@@ -81,10 +81,11 @@ public class TestSortExec {
     workDir = CommonTestingUtil.getTestDir(TEST_PATH);
     sm = TablespaceManager.getLocalFs();
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("managerid", Type.INT4);
-    schema.addColumn("empid", Type.INT4);
-    schema.addColumn("deptname", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("managerid", Type.INT4)
+        .add("empid", Type.INT4)
+        .add("deptname", Type.TEXT)
+        .build();
 
     employeeMeta = CatalogUtil.newTableMeta("TEXT");
 
@@ -156,8 +157,7 @@ public class TestSortExec {
    * Later it should be moved TestUniformPartitions.
    */
   public void testTAJO_946() {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("l_orderkey", Type.INT8);
+    Schema schema = SchemaBuilder.builder().add("l_orderkey", Type.INT8).build();
     SortSpec [] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
     VTuple s = new VTuple(1);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 2012362..7a9385b 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
@@ -27,12 +27,12 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.planner.PhysicalPlanner;
 import org.apache.tajo.engine.planner.PhysicalPlannerImpl;
 import org.apache.tajo.engine.planner.enforce.Enforcer;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalOptimizer;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.LogicalPlanner;
@@ -84,11 +84,12 @@ public class TestSortIntersectExec {
     catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf = util.getConfiguration();
 
-    Schema employeeSchema1 = SchemaFactory.newV1();
-    employeeSchema1.addColumn("managerid", TajoDataTypes.Type.INT4);
-    employeeSchema1.addColumn("empid", TajoDataTypes.Type.INT4);
-    employeeSchema1.addColumn("memid", TajoDataTypes.Type.INT4);
-    employeeSchema1.addColumn("deptname", TajoDataTypes.Type.TEXT);
+    Schema employeeSchema1 = SchemaBuilder.builder()
+        .add("managerid", TajoDataTypes.Type.INT4)
+        .add("empid", TajoDataTypes.Type.INT4)
+        .add("memid", TajoDataTypes.Type.INT4)
+        .add("deptname", TajoDataTypes.Type.TEXT)
+        .build();
 
     TableMeta employeeMeta1 = CatalogUtil.newTableMeta("TEXT");
     Path employeePath1 = new Path(testDir, "employee1.csv");
@@ -111,11 +112,12 @@ public class TestSortIntersectExec {
     employee1 = CatalogUtil.newTableDesc("default.employee1", employeeSchema1, employeeMeta1, employeePath1);
     catalog.createTable(employee1);
 
-    Schema employeeSchema2 = SchemaFactory.newV1();
-    employeeSchema2.addColumn("managerid", TajoDataTypes.Type.INT4);
-    employeeSchema2.addColumn("empid", TajoDataTypes.Type.INT4);
-    employeeSchema2.addColumn("memid", TajoDataTypes.Type.INT4);
-    employeeSchema2.addColumn("deptname", TajoDataTypes.Type.TEXT);
+    Schema employeeSchema2 = SchemaBuilder.builder()
+        .add("managerid", TajoDataTypes.Type.INT4)
+        .add("empid", TajoDataTypes.Type.INT4)
+        .add("memid", TajoDataTypes.Type.INT4)
+        .add("deptname", TajoDataTypes.Type.TEXT)
+        .build();
 
     TableMeta employeeMeta2 = CatalogUtil.newTableMeta("TEXT");
     Path employeePath2 = new Path(testDir, "employee2.csv");

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 3485df4..45546d2 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
@@ -70,7 +70,7 @@ public class TestTupleSorter {
     Column col4 = new Column("col4", Type.INT8);
     Column col5 = new Column("col5", Type.INTERVAL);
 
-    Schema schema = SchemaFactory.newV1(new Column[] {col0, col1, col2, col3, col4, col5});
+    Schema schema = SchemaBuilder.builder().addAll(new Column[] {col0, col1, col2, col3, col4, col5}).build();
 
     long[] time1 = new long[ITERATION];
     long[] time2 = new long[ITERATION];

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 e2b865e..996c7d7 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.SchemaUtil;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
@@ -49,7 +49,7 @@ public class TestUnSafeTuple {
     Column col3 = new Column("col3", Type.FLOAT4);
     Column col4 = new Column("col4", Type.FLOAT8);
 
-    schema = SchemaFactory.newV1(new Column[]{col0, col1, col2, col3, col4});
+    schema = SchemaBuilder.builder().addAll(new Column[]{col0, col1, col2, col3, col4}).build();
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 b346d08..7f7b01f 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,7 +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.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf.ConfVars;
 import org.apache.tajo.storage.StorageConstants;
@@ -421,11 +421,12 @@ public class TestGroupByQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.TEXT);
-    schema.addColumn("code", Type.TEXT);
-    schema.addColumn("qty", Type.INT4);
-    schema.addColumn("qty2", Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.TEXT)
+        .add("code", Type.TEXT)
+        .add("qty", Type.INT4)
+        .add("qty2", Type.FLOAT8)
+        .build();
     String[] data = new String[]{"1|a|3|3.0", "1|a|4|4.0", "1|b|5|5.0", "2|a|1|6.0", "2|c|2|7.0", "2|d|3|8.0"};
     TajoTestingCluster.createTable("table10", schema, tableOptions, data);
 
@@ -475,10 +476,11 @@ public class TestGroupByQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.TEXT);
-    schema.addColumn("col2", Type.TEXT);
-    schema.addColumn("col3", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.TEXT)
+        .add("col2", Type.TEXT)
+        .add("col3", Type.TEXT)
+        .build();
 
     String[] data = new String[]{
         "a|b-1|\\N",
@@ -505,9 +507,10 @@ public class TestGroupByQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.TEXT);
-    schema.addColumn("col2", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.TEXT)
+        .add("col2", Type.TEXT)
+        .build();
 
     String[] data = new String[]{
         "a|\\N",
@@ -692,9 +695,10 @@ public class TestGroupByQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.TEXT);
-    schema.addColumn("col2", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.TEXT)
+        .add("col2", Type.TEXT)
+        .build();
 
     List<String> data = new ArrayList<>();
     int totalBytes = 0;

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 a179f88..bc4628f 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
@@ -23,11 +23,7 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.HColumnDescriptor;
-import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.MiniHBaseCluster;
-import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.*;
 import org.apache.hadoop.hbase.client.*;
 import org.apache.hadoop.hbase.filter.Filter;
 import org.apache.hadoop.hbase.filter.InclusiveStopFilter;
@@ -37,7 +33,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.SchemaBuilder;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
@@ -822,9 +818,10 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.TEXT);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.TEXT)
+        .add("name", Type.TEXT)
+        .build();
     List<String> datas = new ArrayList<>();
     DecimalFormat df = new DecimalFormat("000");
     for (int i = 99; i >= 0; i--) {
@@ -878,9 +875,10 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.TEXT);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.TEXT)
+        .add("name", Type.TEXT)
+        .build();
     List<String> datas = new ArrayList<>();
     for (int i = 99; i >= 0; i--) {
       datas.add(i + "|value" + i);
@@ -936,9 +934,10 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.TEXT);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.TEXT)
+        .add("name", Type.TEXT)
+        .build();
     List<String> datas = new ArrayList<>();
     DecimalFormat df = new DecimalFormat("000");
     for (int i = 99; i >= 0; i--) {
@@ -994,10 +993,11 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id1", Type.TEXT);
-    schema.addColumn("id2", Type.TEXT);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id1", Type.TEXT)
+        .add("id2", Type.TEXT)
+        .add("name", Type.TEXT)
+        .build();
     DecimalFormat df = new DecimalFormat("000");
     List<String> datas = new ArrayList<>();
     for (int i = 99; i >= 0; i--) {
@@ -1051,9 +1051,10 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .build();
     List<String> datas = new ArrayList<>();
     for (int i = 99; i >= 0; i--) {
       datas.add(i + "|value" + i);
@@ -1107,11 +1108,12 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("rk", Type.TEXT);
-    schema.addColumn("col2_key", Type.TEXT);
-    schema.addColumn("col2_value", Type.TEXT);
-    schema.addColumn("col3", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("rk", Type.TEXT)
+        .add("col2_key", Type.TEXT)
+        .add("col2_value", Type.TEXT)
+        .add("col3", Type.TEXT)
+        .build();
     List<String> datas = new ArrayList<>();
     for (int i = 20; i >= 0; i--) {
       for (int j = 0; j < 3; j++) {
@@ -1196,9 +1198,10 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .build();
     List<String> datas = new ArrayList<>();
     for (int i = 99; i >= 0; i--) {
       datas.add(i + "|value" + i);
@@ -1268,9 +1271,10 @@ public class TestHBaseTable extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.TEXT);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.TEXT)
+        .add("name", Type.TEXT)
+        .build();
     List<String> datas = new ArrayList<>();
     DecimalFormat df = new DecimalFormat("000");
     for (int i = 99; i >= 0; i--) {
@@ -1389,10 +1393,11 @@ public class TestHBaseTable extends QueryTestCaseBase {
       tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
       tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-      Schema schema = SchemaFactory.newV1();
-      schema.addColumn("id", Type.TEXT);
-      schema.addColumn("name", Type.TEXT);
-      schema.addColumn("comment", Type.TEXT);
+      Schema schema = SchemaBuilder.builder()
+          .add("id", Type.TEXT)
+          .add("name", Type.TEXT)
+          .add("comment", Type.TEXT)
+          .build();
       List<String> datas = new ArrayList<>();
       DecimalFormat df = new DecimalFormat("000");
       for (int i = 99; i >= 0; i--) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 34f26a6..4aaca65 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
@@ -146,39 +146,45 @@ public class TestJoinQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("name", TajoDataTypes.Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("name", TajoDataTypes.Type.TEXT)
+        .build();
     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 = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("name", TajoDataTypes.Type.TEXT);
+    schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("name", TajoDataTypes.Type.TEXT)
+        .build();
     data = new String[]{"1|table12-1", "2|table12-2"};
     TajoTestingCluster.createTable("jointable12", schema, tableOptions, data, 2);
 
-    schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("name", TajoDataTypes.Type.TEXT);
+    schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("name", TajoDataTypes.Type.TEXT)
+        .build();
     data = new String[]{"2|table13-2", "3|table13-3"};
     TajoTestingCluster.createTable("jointable13", schema, tableOptions, data);
 
-    schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("name", TajoDataTypes.Type.TEXT);
+    schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("name", TajoDataTypes.Type.TEXT)
+        .build();
     data = new String[]{"1|table14-1", "2|table14-2", "3|table14-3", "4|table14-4"};
     TajoTestingCluster.createTable("jointable14", schema, tableOptions, data);
 
-    schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("name", TajoDataTypes.Type.TEXT);
+    schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("name", TajoDataTypes.Type.TEXT)
+        .build();
     data = new String[]{};
     TajoTestingCluster.createTable("jointable15", schema, tableOptions, data);
 
-    schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("name", TajoDataTypes.Type.TEXT);
+    schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("name", TajoDataTypes.Type.TEXT)
+        .build();
     data = new String[]{"1000000|a", "1000001|b", "2|c", "3|d", "4|e"};
     TajoTestingCluster.createTable("jointable1", schema, tableOptions, data, 1);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 2bca027..1966332 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,7 +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.catalog.SchemaBuilder;
 import org.apache.tajo.client.TajoClient;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.storage.StorageConstants;
@@ -59,10 +59,11 @@ public class TestNullValues {
   @Test
   public final void testIsNull() throws Exception {
     String [] table = new String[] {"nulltable1"};
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.INT4);
-    schema.addColumn("col2", Type.TEXT);
-    schema.addColumn("col3", Type.FLOAT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.INT4)
+        .add("col2", Type.TEXT)
+        .add("col3", Type.FLOAT4)
+        .build();
     Schema [] schemas = new Schema[] {schema};
     String [] data = {
         "1|filled|0.1",
@@ -84,9 +85,10 @@ public class TestNullValues {
   @Test
   public final void testIsNotNull() throws Exception {
     String [] table = new String[] {"nulltable2"};
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.INT4);
-    schema.addColumn("col2", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.INT4)
+        .add("col2", Type.TEXT)
+        .build();
     Schema [] schemas = new Schema[] {schema};
     String [] data = {
         "1|filled|",
@@ -109,17 +111,18 @@ public class TestNullValues {
   @Test
   public final void testIsNotNull2() throws Exception {
     String [] table = new String[] {"nulltable3"};
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.INT8);
-    schema.addColumn("col2", Type.INT8);
-    schema.addColumn("col3", Type.INT8);
-    schema.addColumn("col4", Type.INT8);
-    schema.addColumn("col5", Type.INT8);
-    schema.addColumn("col6", Type.INT8);
-    schema.addColumn("col7", Type.INT8);
-    schema.addColumn("col8", Type.INT8);
-    schema.addColumn("col9", Type.INT8);
-    schema.addColumn("col10", Type.INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.INT8)
+        .add("col2", Type.INT8)
+        .add("col3", Type.INT8)
+        .add("col4", Type.INT8)
+        .add("col5", Type.INT8)
+        .add("col6", Type.INT8)
+        .add("col7", Type.INT8)
+        .add("col8", Type.INT8)
+        .add("col9", Type.INT8)
+        .add("col10", Type.INT8)
+        .build();
     Schema [] schemas = new Schema[] {schema};
     String [] data = {
         ",,,,672287821,1301460,1,313895860387,126288907,1024",
@@ -139,17 +142,18 @@ public class TestNullValues {
   @Test
   public final void testIsNotNull3() throws Exception {
     String [] table = new String[] {"nulltable4"};
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.INT8);
-    schema.addColumn("col2", Type.INT8);
-    schema.addColumn("col3", Type.INT8);
-    schema.addColumn("col4", Type.INT8);
-    schema.addColumn("col5", Type.INT8);
-    schema.addColumn("col6", Type.INT8);
-    schema.addColumn("col7", Type.INT8);
-    schema.addColumn("col8", Type.INT8);
-    schema.addColumn("col9", Type.INT8);
-    schema.addColumn("col10", Type.INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.INT8)
+        .add("col2", Type.INT8)
+        .add("col3", Type.INT8)
+        .add("col4", Type.INT8)
+        .add("col5", Type.INT8)
+        .add("col6", Type.INT8)
+        .add("col7", Type.INT8)
+        .add("col8", Type.INT8)
+        .add("col9", Type.INT8)
+        .add("col10", Type.INT8)
+        .build();
     Schema [] schemas = new Schema[] {schema};
     String [] data = {
         "\\N,,,,672287821,",
@@ -252,11 +256,12 @@ public class TestNullValues {
 
   private ResultSet runNullTableQuery(String tableName, String query, TajoClient client) throws Exception {
     String [] table = new String[] {tableName};
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.INT4);
-    schema.addColumn("col2", Type.TEXT);
-    schema.addColumn("col3", Type.FLOAT4);
-    schema.addColumn("col4", Type.BOOLEAN);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.INT4)
+        .add("col2", Type.TEXT)
+        .add("col3", Type.FLOAT4)
+        .add("col4", Type.BOOLEAN)
+        .build();
     Schema [] schemas = new Schema[] {schema};
     String [] data = {
         "\\N|a|1.0|t",

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 f206e20..61b5551 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.client.QueryStatus;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -499,9 +499,10 @@ public class TestSelectQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .build();
     String[] data = new String[]{ "1|table11-1", "2|table11-2", "3|table11-3", "4|table11-4", "5|table11-5" };
     TajoTestingCluster.createTable("testNowInMultipleTasks".toLowerCase(), schema, tableOptions, data, 2);
 


[4/6] tajo git commit: TAJO-2108: Refactor Schema to be immutable.

Posted by hy...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 ae2de77..62cbd9e 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,7 +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.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.storage.StorageConstants;
 import org.apache.tajo.util.KeyValueSet;
@@ -54,9 +54,10 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value", TajoDataTypes.Type.INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value", TajoDataTypes.Type.INT8)
+        .build();
     String[] data = new String[]{ "1|-111", "2|\\N", "3|-333" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
 
@@ -80,8 +81,9 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("value", TajoDataTypes.Type.DATE);
+    Schema schema = SchemaBuilder.builder()
+        .add("value", TajoDataTypes.Type.DATE)
+        .build();
     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);
 
@@ -104,8 +106,9 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("value", TajoDataTypes.Type.DATE);
+    Schema schema = SchemaBuilder.builder()
+        .add("value", TajoDataTypes.Type.DATE)
+        .build();
     String[] data = new String[]{ "2014-01-02", "2014-12-01", "\\N", "\\N", "2000-03-01" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
 
@@ -128,8 +131,9 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("value", TajoDataTypes.Type.TIME);
+    Schema schema = SchemaBuilder.builder()
+        .add("value", TajoDataTypes.Type.TIME)
+        .build();
     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);
 
@@ -152,8 +156,9 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("value", TajoDataTypes.Type.TIME);
+    Schema schema = SchemaBuilder.builder()
+        .add("value", TajoDataTypes.Type.TIME)
+        .build();
     String[] data = new String[]{ "11:11:11", "\\N", "\\N", "09:59:59", "12:13:14" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
 
@@ -176,8 +181,9 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("value", TajoDataTypes.Type.TIMESTAMP);
+    Schema schema = SchemaBuilder.builder()
+        .add("value", TajoDataTypes.Type.TIMESTAMP)
+        .build();
     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" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
@@ -201,8 +207,7 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("value", TajoDataTypes.Type.TIMESTAMP);
+    Schema schema = SchemaBuilder.builder().add("value", TajoDataTypes.Type.TIMESTAMP).build();
     String[] data = new String[]{ "1999-01-01 11:11:11", "2015-01-01 23:12:50", "\\N",
             "\\N", "2002-11-21 12:13:14" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
@@ -233,9 +238,10 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value", TajoDataTypes.Type.INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value", TajoDataTypes.Type.INT8)
+        .build();
     String[] data = new String[]{ "1|111", "2|\\N", "3|333" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
 
@@ -266,9 +272,10 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("name", TajoDataTypes.Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("name", TajoDataTypes.Type.TEXT)
+        .build();
     String[] data = new String[]{ "1|\\N", "2|\\N", "3|\\N" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
 
@@ -299,9 +306,10 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("name", TajoDataTypes.Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("name", TajoDataTypes.Type.TEXT)
+        .build();
     String[] data = new String[]{ "1|def", "2|\\N", "3|abc" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
 
@@ -360,12 +368,13 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_int", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_long", TajoDataTypes.Type.INT8);
-    schema.addColumn("value_float", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("value_double", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value_int", TajoDataTypes.Type.INT4)
+        .add("value_long", TajoDataTypes.Type.INT8)
+        .add("value_float", TajoDataTypes.Type.FLOAT4)
+        .add("value_double", TajoDataTypes.Type.FLOAT8)
+        .build();
     String[] data = new String[]{ "1|\\N|-111|1.2|-50.5", "2|1|\\N|\\N|52.5", "3|2|-333|2.8|\\N" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
 
@@ -389,12 +398,13 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_int", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_long", TajoDataTypes.Type.INT8);
-    schema.addColumn("value_float", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("value_double", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value_int", TajoDataTypes.Type.INT4)
+        .add("value_long", TajoDataTypes.Type.INT8)
+        .add("value_float", TajoDataTypes.Type.FLOAT4)
+        .add("value_double", TajoDataTypes.Type.FLOAT8)
+        .build();
     String[] data = new String[]{ "1|\\N|\\N|\\N|\\N", "2|\\N|\\N|\\N|\\N", "3|\\N|\\N|\\N|\\N" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
 
@@ -418,12 +428,13 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_int", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_long", TajoDataTypes.Type.INT8);
-    schema.addColumn("value_float", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("value_double", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value_int", TajoDataTypes.Type.INT4)
+        .add("value_long", TajoDataTypes.Type.INT8)
+        .add("value_float", TajoDataTypes.Type.FLOAT4)
+        .add("value_double", TajoDataTypes.Type.FLOAT8)
+        .build();
     String[] data = new String[]{ "1|\\N|-111|1.2|-50.5", "2|1|\\N|\\N|52.5", "3|2|-333|2.8|\\N" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
 
@@ -447,12 +458,13 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_int", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_long", TajoDataTypes.Type.INT8);
-    schema.addColumn("value_float", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("value_double", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value_int", TajoDataTypes.Type.INT4)
+        .add("value_long", TajoDataTypes.Type.INT8)
+        .add("value_float", TajoDataTypes.Type.FLOAT4)
+        .add("value_double", TajoDataTypes.Type.FLOAT8)
+        .build();
     String[] data = new String[]{ "1|\\N|\\N|\\N|\\N", "2|\\N|\\N|\\N|\\N", "3|\\N|\\N|\\N|\\N" };
     TajoTestingCluster.createTable("testbuiltin11", schema, tableOptions, data, 1);
 
@@ -476,12 +488,13 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_int", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_long", TajoDataTypes.Type.INT8);
-    schema.addColumn("value_float", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("value_double", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value_int", TajoDataTypes.Type.INT4)
+        .add("value_long", TajoDataTypes.Type.INT8)
+        .add("value_float", TajoDataTypes.Type.FLOAT4)
+        .add("value_double", TajoDataTypes.Type.FLOAT8)
+        .build();
     String[] data = new String[]{
         "1|\\N|-111|1.2|-50.5",
         "2|1|\\N|\\N|52.5",
@@ -508,12 +521,13 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_int", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_long", TajoDataTypes.Type.INT8);
-    schema.addColumn("value_float", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("value_double", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value_int", TajoDataTypes.Type.INT4)
+        .add("value_long", TajoDataTypes.Type.INT8)
+        .add("value_float", TajoDataTypes.Type.FLOAT4)
+        .add("value_double", TajoDataTypes.Type.FLOAT8)
+        .build();
     String[] data = new String[]{
         "1|\\N|\\N|\\N|-50.5",
         "2|1|\\N|\\N|\\N",
@@ -540,12 +554,13 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_int", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_long", TajoDataTypes.Type.INT8);
-    schema.addColumn("value_float", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("value_double", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value_int", TajoDataTypes.Type.INT4)
+        .add("value_long", TajoDataTypes.Type.INT8)
+        .add("value_float", TajoDataTypes.Type.FLOAT4)
+        .add("value_double", TajoDataTypes.Type.FLOAT8)
+        .build();
     String[] data = new String[]{
         "1|\\N|-111|1.2|-50.5",
         "2|1|\\N|\\N|52.5",
@@ -572,12 +587,13 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_int", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_long", TajoDataTypes.Type.INT8);
-    schema.addColumn("value_float", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("value_double", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value_int", TajoDataTypes.Type.INT4)
+        .add("value_long", TajoDataTypes.Type.INT8)
+        .add("value_float", TajoDataTypes.Type.FLOAT4)
+        .add("value_double", TajoDataTypes.Type.FLOAT8)
+        .build();
     String[] data = new String[]{
         "1|\\N|\\N|\\N|-50.5",
         "2|1|\\N|\\N|\\N",
@@ -604,12 +620,13 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_int", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_long", TajoDataTypes.Type.INT8);
-    schema.addColumn("value_float", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("value_double", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value_int", TajoDataTypes.Type.INT4)
+        .add("value_long", TajoDataTypes.Type.INT8)
+        .add("value_float", TajoDataTypes.Type.FLOAT4)
+        .add("value_double", TajoDataTypes.Type.FLOAT8)
+        .build();
     String[] data = new String[]{
             "1|\\N|-111|1.2|-50.5",
             "2|1|\\N|\\N|52.5",
@@ -635,12 +652,13 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_int", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_long", TajoDataTypes.Type.INT8);
-    schema.addColumn("value_float", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("value_double", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value_int", TajoDataTypes.Type.INT4)
+        .add("value_long", TajoDataTypes.Type.INT8)
+        .add("value_float", TajoDataTypes.Type.FLOAT4)
+        .add("value_double", TajoDataTypes.Type.FLOAT8)
+        .build();
     String[] data = new String[]{
             "1|\\N|\\N|\\N|-50.5",
             "2|1|\\N|\\N|\\N",
@@ -666,12 +684,13 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_int", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_long", TajoDataTypes.Type.INT8);
-    schema.addColumn("value_float", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("value_double", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value_int", TajoDataTypes.Type.INT4)
+        .add("value_long", TajoDataTypes.Type.INT8)
+        .add("value_float", TajoDataTypes.Type.FLOAT4)
+        .add("value_double", TajoDataTypes.Type.FLOAT8)
+        .build();
     String[] data = new String[]{
             "1|\\N|-111|1.2|-50.5",
             "2|1|\\N|\\N|52.5",
@@ -697,12 +716,13 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_int", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_long", TajoDataTypes.Type.INT8);
-    schema.addColumn("value_float", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("value_double", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value_int", TajoDataTypes.Type.INT4)
+        .add("value_long", TajoDataTypes.Type.INT8)
+        .add("value_float", TajoDataTypes.Type.FLOAT4)
+        .add("value_double", TajoDataTypes.Type.FLOAT8)
+        .build();
     String[] data = new String[]{
             "1|\\N|\\N|\\N|-50.5",
             "2|1|\\N|\\N|\\N",
@@ -757,14 +777,16 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     KeyValueSet tableOptions = new KeyValueSet();
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
-    
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
+
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .build();
     String[] data = new String[] {"1", "3", "2", "4"};
     TajoTestingCluster.createTable("rank_table1", schema, tableOptions, data, 1);
-    schema = SchemaFactory.newV1();
-    schema.addColumn("refid", TajoDataTypes.Type.INT4);
-    schema.addColumn("value", TajoDataTypes.Type.TEXT);
+    schema = SchemaBuilder.builder()
+        .add("refid", TajoDataTypes.Type.INT4)
+        .add("value", TajoDataTypes.Type.TEXT)
+        .build();
     data = new String[] {"1|efgh", "2|abcd", "4|erjk", "8|dfef"};
     TajoTestingCluster.createTable("rank_table2", schema, tableOptions, data, 1);
     ResultSet res = null;
@@ -796,12 +818,13 @@ public class TestBuiltinFunctions extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_int", TajoDataTypes.Type.INT4);
-    schema.addColumn("value_long", TajoDataTypes.Type.INT8);
-    schema.addColumn("value_float", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("value_double", TajoDataTypes.Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("value_int", TajoDataTypes.Type.INT4)
+        .add("value_long", TajoDataTypes.Type.INT8)
+        .add("value_float", TajoDataTypes.Type.FLOAT4)
+        .add("value_double", TajoDataTypes.Type.FLOAT8)
+        .build();
     String[] data = new String[]{
         "1|\\N|-111|1.2|-50.5",
         "2|1|\\N|\\N|52.5",

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 9a072ef..20045ad 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,12 +20,12 @@ 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.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.exception.UndefinedFunctionException;
 import org.junit.Test;
 
 import static org.junit.Assert.fail;
@@ -33,16 +33,17 @@ import static org.junit.Assert.fail;
 public class TestConditionalExpressions extends ExprTestBase {
   @Test
   public void testCaseWhens1() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TajoDataTypes.Type.INT1);
-    schema.addColumn("col2", TajoDataTypes.Type.INT2);
-    schema.addColumn("col3", TajoDataTypes.Type.INT4);
-    schema.addColumn("col4", TajoDataTypes.Type.INT8);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col6", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col7", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col8", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3));
-    schema.addColumn("col9", TajoDataTypes.Type.INT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TajoDataTypes.Type.INT1)
+        .add("col2", TajoDataTypes.Type.INT2)
+        .add("col3", TajoDataTypes.Type.INT4)
+        .add("col4", TajoDataTypes.Type.INT8)
+        .add("col5", TajoDataTypes.Type.FLOAT4)
+        .add("col6", TajoDataTypes.Type.FLOAT8)
+        .add("col7", TajoDataTypes.Type.TEXT)
+        .add("col8", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3))
+        .add("col9", TajoDataTypes.Type.INT4)
+        .build();
 
     testEval(schema, "table1", "1,2,3,4,5.0,6.0,text,abc,",
         "select case when col1 between 1 and 3 then 10 else 100 end from table1;",
@@ -60,9 +61,10 @@ public class TestConditionalExpressions extends ExprTestBase {
 
   @Test
   public void testCaseWhensWithNullReturn() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col2", TajoDataTypes.Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TajoDataTypes.Type.TEXT)
+        .add("col2", TajoDataTypes.Type.TEXT)
+        .build();
 
     testEval(schema, "table1", "str1,str2",
         "SELECT CASE WHEN col1 IS NOT NULL THEN col2 ELSE NULL END FROM table1",
@@ -74,10 +76,11 @@ public class TestConditionalExpressions extends ExprTestBase {
 
   @Test
   public void testCaseWhensWithCommonExpression() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TajoDataTypes.Type.INT4);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TajoDataTypes.Type.INT4)
+        .add("col2", TajoDataTypes.Type.INT4)
+        .add("col3", TajoDataTypes.Type.INT4)
+        .build();
 
     testEval(schema, "table1", "1,2,3",
         "SELECT CASE WHEN col1 = 1 THEN 1 WHEN col1 = 2 THEN 2 ELSE 3 END FROM table1",
@@ -112,10 +115,11 @@ public class TestConditionalExpressions extends ExprTestBase {
 
   @Test
   public void testCaseWhensWithCommonExpressionAndNull() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TajoDataTypes.Type.INT4);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TajoDataTypes.Type.INT4)
+        .add("col2", TajoDataTypes.Type.INT4)
+        .add("col3", TajoDataTypes.Type.INT4)
+        .build();
 
     testEval(schema, "table1", "1,2,3",
         "SELECT CASE col1 WHEN 1 THEN NULL WHEN 2 THEN 2 ELSE 3 END FROM table1",

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 36a4a60..3682006 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,7 +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.catalog.SchemaBuilder;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.TimestampDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
@@ -120,8 +120,9 @@ public class TestDateTimeFunctions extends ExprTestBase {
     TimeZone GMT = TimeZone.getTimeZone("GMT");
     TimeZone PST = TimeZone.getTimeZone("PST");
 
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("col1", TIMESTAMP);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("col1", TIMESTAMP)
+        .build();
     testEval(schema2, "table1",
         "1970-01-17 10:09:37",
         "select extract(year from col1), extract(month from col1), extract(day from col1) from table1;",
@@ -136,8 +137,9 @@ public class TestDateTimeFunctions extends ExprTestBase {
         new String[]{"1970.0", "1.0", "17.0"});
 
     // Currently TIME type can be loaded with INT8 type.
-    Schema schema3 = SchemaFactory.newV1();
-    schema3.addColumn("col1", TIME);
+    Schema schema3 = SchemaBuilder.builder()
+        .add("col1", TIME)
+        .build();
     testEval(schema3, "table1",
         "10:09:37.5",
         "select extract(hour from col1), extract(minute from col1), extract(second from col1) from table1;",
@@ -151,8 +153,9 @@ 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 = SchemaFactory.newV1();
-    schema4.addColumn("col1", DATE);
+    Schema schema4 = SchemaBuilder.builder()
+        .add("col1", DATE)
+        .build();
     testEval(schema4, "table1",
         "1970-01-17",
         "select extract(year from col1), extract(month from col1), extract(day from col1) from table1;",
@@ -236,8 +239,8 @@ public class TestDateTimeFunctions extends ExprTestBase {
     TimeZone GMT = TimeZone.getTimeZone("GMT");
     TimeZone PST = TimeZone.getTimeZone("PST");
 
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("col1", TIMESTAMP);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("col1", TIMESTAMP).build();
 
     testEval(schema2, "table1",
         "1970-01-17 22:09:37",
@@ -252,8 +255,9 @@ 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 = SchemaFactory.newV1();
-    schema3.addColumn("col1", TIME);
+    Schema schema3 = SchemaBuilder.builder()
+        .add("col1", TIME)
+        .build();
     testEval(schema3, "table1", "10:09:37.5",
         "select date_part('hour', col1), date_part('minute', col1), date_part('second', col1) from table1;",
         new String[]{"10.0", "9.0", "37.5"});
@@ -264,8 +268,9 @@ 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 = SchemaFactory.newV1();
-    schema4.addColumn("col1", DATE);
+    Schema schema4 = SchemaBuilder.builder()
+        .add("col1", DATE)
+        .build();
     testEval(schema4, "table1",
         "1970-01-17",
         "select date_part('year', col1), date_part('month', col1), date_part('day', col1) from table1;",

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 1c07388..40d51ed 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
@@ -6,9 +6,9 @@
  * 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
- *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
  * 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.
@@ -19,7 +19,7 @@
 package org.apache.tajo.engine.function;
 
 import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.SchemaFactory;
+import org.apache.tajo.catalog.SchemaBuilder;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
 import org.apache.tajo.exception.TajoException;
@@ -38,23 +38,25 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT8);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema, "table1", "1.0, 0.2, 0.4", "select round(col1 + col2 + col3) from table1",
         new String[]{"2"});
 
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("col1", INT4);
-    schema2.addColumn("col2", INT8);
-    schema2.addColumn("col3", FLOAT4);
-    schema2.addColumn("col4", FLOAT8);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("col1", INT4)
+        .add("col2", INT8)
+        .add("col3", FLOAT4)
+        .add("col4", FLOAT8)
+        .build();
 
     testEval(schema2, "table1", "9,9,9.5,9.5",
         "select round(col1), round (col2), round(col3), round(col4) from table1",
-        new String [] {"9", "9", "10", "10"});
+        new String[]{"9", "9", "10", "10"});
   }
 
   @Test
@@ -66,10 +68,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT8);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema, "table1", "1.0, 0.2, 0.4", "select floor(col1 + col2 + col3) from table1",
         new String[]{"1"});
@@ -85,10 +88,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT8);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema, "table1", "1.0, 0.2, 0.1", "select ceil(col1 + col2 + col3) from table1",
         new String[]{"2"});
@@ -104,10 +108,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT8);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema, "table1", "1.0, 0.2, 0.1", "select ceiling(col1 + col2 + col3) from table1",
         new String[]{"2"});
@@ -120,10 +125,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT8);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema, "table1", "1.0, 0.2, 0.1", "select sin(col1 + col2 + col3) from table1",
         new String[]{"0.963558185417193"});
@@ -137,10 +143,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT8);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema, "table1", "1.0, 0.2, 0.1", "select cos(col1 + col2 + col3) from table1",
         new String[]{"0.26749882862458735"});
@@ -153,10 +160,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT8);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema, "table1", "1.0, 0.2, 0.1", "select tan(col1 - col2 - col3) from table1",
         new String[]{"0.8422883804630795"});
@@ -169,10 +177,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT8);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema, "table1", "1.0, 0.2, 0.1", "select asin(col1 - col2 - col3) from table1",
         new String[]{"0.7753974966107532"});
@@ -185,10 +194,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT8);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema, "table1", "1.0, 0.2, 0.1", "select acos(col1 - col2 - col3) from table1",
         new String[]{"0.7953988301841435"});
@@ -201,10 +211,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT8);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema, "table1", "1.0, 0.2, 0.1", "select atan(col1 + col2 + col3) from table1",
         new String[]{"0.9151007005533605"});
@@ -218,10 +229,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT8);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema, "table1", "1.0, 0.2, 0.1", "select atan2(col1 + col2, col3) from table1",
         new String[]{"1.4876550949064553"});
@@ -234,12 +246,13 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", INT8);
-    schema.addColumn("col2", INT8);
-    schema.addColumn("col3", INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", INT8)
+        .add("col2", INT8)
+        .add("col3", INT8)
+        .build();
 
-    testEval(schema, "table1", "9,2,3", "select mod(col1 + col2, col3) from table1", 
+    testEval(schema, "table1", "9,2,3", "select mod(col1 + col2, col3) from table1",
         new String[]{"2"});
   }
 
@@ -250,12 +263,13 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", INT8);
-    schema.addColumn("col2", INT8);
-    schema.addColumn("col3", INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", INT8)
+        .add("col2", INT8)
+        .add("col3", INT8)
+        .build();
 
-    testEval(schema, "table1", "9,2,3", "select div(col1 + col2, col3) from table1", 
+    testEval(schema, "table1", "9,2,3", "select div(col1 + col2, col3) from table1",
         new String[]{"3"});
   }
 
@@ -266,19 +280,21 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select sign(0.3) as col1 ", new String[]{"1.0"});
 
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT4);
-    schema.addColumn("col2", FLOAT4);
-    schema.addColumn("col3", FLOAT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT4)
+        .add("col2", FLOAT4)
+        .add("col3", FLOAT4)
+        .build();
 
     testEval(schema, "table1", "1.0, 0.2, 0.1", "select sign(col1 + col2 + col3) from table1",
         new String[]{"1.0"});
 
 
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("col1", FLOAT8);
-    schema2.addColumn("col2", FLOAT8);
-    schema2.addColumn("col3", FLOAT8);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema2, "table1", "1.0, 0.2, 0.1", "select sign(col1 + col2 + col3) from table1",
         new String[]{"1.0"});
@@ -291,19 +307,21 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select sqrt(8.0) as col1 ", new String[]{"2.8284271247461903"});
 
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT4);
-    schema.addColumn("col2", FLOAT4);
-    schema.addColumn("col3", FLOAT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT4)
+        .add("col2", FLOAT4)
+        .add("col3", FLOAT4)
+        .build();
 
     testEval(schema, "table1", "1.0, 0.2, 0.1", "select sqrt(col1 + col2 + col3) from table1",
         new String[]{"1.1401754564651765"});
 
 
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("col1", FLOAT8);
-    schema2.addColumn("col2", FLOAT8);
-    schema2.addColumn("col3", FLOAT8);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema2, "table1", "1.0, 0.2, 0.1", "select sqrt(col1 + col2 + col3) from table1",
         new String[]{"1.140175425099138"});
@@ -316,14 +334,16 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select exp(1.2) as col1 ", new String[]{String.valueOf(Math.exp(1.2d))});
 
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT4)
+        .build();
 
     testEval(schema, "table1", "1.123", "select exp(col1) from table1",
         new String[]{String.valueOf(Math.exp(1.123f))});
 
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("col1", FLOAT8);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .build();
 
     testEval(schema2, "table1", "1.123", "select exp(col1) from table1",
         new String[]{String.valueOf(Math.exp(1.123d))});
@@ -339,14 +359,16 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT4);
-    schema.addColumn("col2", FLOAT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT4)
+        .add("col2", FLOAT4)
+        .build();
     testEval(schema, "table1", "0.39,-0.39", "select abs(col1), abs(col2) from table1", new String[]{"0.39", "0.39"});
 
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("col1", FLOAT8);
-    schema2.addColumn("col2", FLOAT8);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .build();
     testEval(schema2, "table1", "0.033312347,-0.033312347", "select abs(col1), abs(col2) from table1",
         new String[]{"0.033312347", "0.033312347"});
   }
@@ -358,17 +380,19 @@ public class TestMathFunctions extends ExprTestBase {
     testSimpleEval("select cbrt(8.0) as col1 ", new String[]{"2.0"});
 
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT4);
-    schema.addColumn("col2", FLOAT4);
-    schema.addColumn("col3", FLOAT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT4)
+        .add("col2", FLOAT4)
+        .add("col3", FLOAT4)
+        .build();
     testEval(schema, "table1", "1.0, 0.2, 0.1", "select cbrt(col1 + col2 + col3) from table1",
         new String[]{"1.0913929030771317"});
 
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("col1", FLOAT8);
-    schema2.addColumn("col2", FLOAT8);
-    schema2.addColumn("col3", FLOAT8);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
     testEval(schema2, "table1", "1.0, 0.2, 0.1", "select cbrt(col1 + col2 + col3) from table1",
         new String[]{"1.091392883061106"});
   }
@@ -380,14 +404,15 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT4);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT4)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema, "table1", "0.8,2.7,-0.8", "select degrees(col1), degrees(col2), degrees(col3) from table1",
         new String[]{
-            String.valueOf(Math.toDegrees((float)0.8)),
+            String.valueOf(Math.toDegrees((float) 0.8)),
             String.valueOf(Math.toDegrees(2.7)),
             String.valueOf(Math.toDegrees(-0.8))
         });
@@ -401,11 +426,12 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT4);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", INT4);
-    schema.addColumn("col4", INT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT4)
+        .add("col2", FLOAT8)
+        .add("col3", INT4)
+        .add("col4", INT8)
+        .build();
 
     testEval(schema, "table1", "0.4,2.7,3,2", "select pow(col1, col2), pow(col3, col4) from table1",
         new String[]{
@@ -421,14 +447,15 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT4);
-    schema.addColumn("col2", FLOAT8);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT4)
+        .add("col2", FLOAT8)
+        .add("col3", FLOAT8)
+        .build();
 
     testEval(schema, "table1", "0.8,2.7,-0.8", "select radians(col1), radians(col2), radians(col3) from table1",
         new String[]{
-            String.valueOf(Math.toRadians((float)0.8)),
+            String.valueOf(Math.toRadians((float) 0.8)),
             String.valueOf(Math.toRadians(2.7)),
             String.valueOf(Math.toRadians(-0.8))
         });
@@ -463,9 +490,10 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", FLOAT8);
-    schema.addColumn("col2", INT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", FLOAT8)
+        .add("col2", INT4)
+        .build();
 
     testEval(schema, "table1", ",", "select round(col1, col2) from table1", new String[]{NullDatum.get().toString()});
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 0cfbe1c..54907fc 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,7 +19,7 @@
 package org.apache.tajo.engine.function;
 
 import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.SchemaFactory;
+import org.apache.tajo.catalog.SchemaBuilder;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
 import org.apache.tajo.exception.TajoException;
@@ -31,8 +31,9 @@ public class TestPatternMatchingPredicates extends ExprTestBase {
 
   @Test
   public void testLike() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .build();
 
     // test for null values
     testEval(schema, "table1", ",", "select col1 like 'a%' from table1", new String[]{NullDatum.get().toString()});

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 dd40822..203af8f 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,7 +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.catalog.SchemaBuilder;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
 import org.apache.tajo.exception.TajoException;
@@ -41,10 +41,11 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
 
   @Test
   public void testConcatenateOnExpressions() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", INT4);
-    schema.addColumn("col3", FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", INT4)
+        .add("col3", FLOAT8)
+        .build();
 
     testSimpleEval("select (1+3) || 2 as col1 ", new String[]{"42"});
 
@@ -62,9 +63,10 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
 
   @Test
   public void testLTrim() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .build();
 
     testSimpleEval("select ltrim(' trim') ", new String[]{"trim"});
     testSimpleEval("select ltrim('xxtrim', 'xx') ", new String[]{"trim"});
@@ -83,9 +85,10 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
 
   @Test
   public void testRTrim() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .build();
 
     testSimpleEval("select rtrim('trim ') ", new String[]{"trim"});
     testSimpleEval("select rtrim('trimxx', 'xx') ", new String[]{"trim"});
@@ -104,9 +107,10 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
 
   @Test
   public void testTrim() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .build();
 
     testSimpleEval("select trim(' trim ') ", new String[]{"trim"});
     testSimpleEval("select btrim('xxtrimxx', 'xx') ", new String[]{"trim"});
@@ -132,10 +136,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
 
     // find matches and replace from column values
     testEval(schema, "table1", "------,(^--|--$),ab", "select regexp_replace(col1, col2, col3) as str from table1",
@@ -165,10 +170,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", INT4);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", INT4)
+        .add("col3", TEXT)
+        .build();
 
     // for null tests
     testEval(schema, "table1", ",1,ghi", "select left(col1,1) is null from table1", new String[]{"t"});
@@ -194,10 +200,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", INT4);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", INT4)
+        .add("col3", TEXT)
+        .build();
 
     // for null tests
     testEval(schema, "table1", ",1,ghi", "select right(col1,1) is null from table1", new String[]{"t"});
@@ -211,10 +218,11 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select reverse('abcdef') as col1 ", new String[]{"fedcba"});
     testSimpleEval("select reverse('가') as col1 ", new String[]{"가"});
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", "abc,efg,3.14", "select reverse(col1) || reverse(col2) from table1",
         new String[]{"cbagfe"});
   }
@@ -225,10 +233,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", "abc,efg,3.14", "select repeat(col1,2) from table1", new String[]{"abcabc"});
   }
 
@@ -237,10 +246,11 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
   public void testUpper() throws TajoException {
     testSimpleEval("select upper('abcdef') as col1 ", new String[]{"ABCDEF"});
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", "abc,efg,3.14", "select upper(col1), upper(col2) from table1",
         new String[]{"ABC", "EFG"});
     testEval(schema, "table1", "abc,efg,3.14", "select upper(col1) || upper(col2) from table1", new String[]{"ABCEFG"});
@@ -250,10 +260,12 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
   public void testLower() throws TajoException {
     testSimpleEval("select lower('ABCdEF') as col1 ", new String[]{"abcdef"});
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
+
     testEval(schema, "table1", "ABC,DEF,3.14", "select lower(col1), lower(col2) from table1",
         new String[]{"abc", "def"});
     testEval(schema, "table1", "ABC,DEF,3.14", "select lower(col1) || lower(col2) from table1", new String[]{"abcdef"});
@@ -263,10 +275,11 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
   public void testCharLength() throws TajoException {
     testSimpleEval("select char_length('123456') as col1 ", new String[]{"6"});
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", "ABC,DEF,3.14", "select character_length(lower(col1) || lower(col2)) from table1",
         new String[]{"6"});
   }
@@ -275,10 +288,11 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
   public void testLength() throws TajoException {
     testSimpleEval("select length('123456') as col1 ", new String[]{"6"});
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", "ABC,DEF,3.14", "select length(lower(col1) || lower(col2)) from table1",
         new String[]{"6"});
   }
@@ -288,10 +302,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", "abc,efg,3.14", "select md5(col1) from table1",
         new String[]{"900150983cd24fb0d6963f7d28e17f72"});
   }
@@ -317,10 +332,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", ",abcdef,3.14", "select to_hex(10) from table1",
         new String[]{"a"});
   }
@@ -331,10 +347,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", ",abcdef,3.14", "select to_bin(20) from table1",
         new String[]{"10100"});
   }
@@ -345,10 +362,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", "ABC,DEF,3.14", "select octet_length(lower(col1) || lower(col2)) from table1",
         new String[]{"6"});
   }
@@ -361,10 +379,11 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select split_part('1386577650.123', '.', 3) is null", new String[]{"t"});
 
     // null handling tests
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "t1", ",.,1", "select split_part(col1, col2, col3::int) is null from t1", new String[]{"t"});
     testEval(schema, "t1", "1386577650.123,,1", "select split_part(col1, col2, col3::int) from t1",
         new String[]{"1386577650.123"});
@@ -390,10 +409,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", ",abcdef,3.14", "select substr(lower(col2), 2, 3) from table1",
         new String[]{"bcd"});
   }
@@ -433,10 +453,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", ",abcdef,3.14", "select locate(col2, 'cd') from table1", new String[]{"3"});
     testEval(schema, "table1", ",abcdef,3.14", "select locate(col2, 'cd', 1) from table1", new String[]{"3"});
     testEval(schema, "table1", ",abcdef,3.14", "select locate(col2, 'cd', 4) from table1", new String[]{"0"});
@@ -451,10 +472,11 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
   public void testBitLength() throws TajoException {
     testSimpleEval("select bit_length('123456') as col1 ", new String[]{"48"});
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", "ABC,DEF,3.14", "select bit_length(lower(col1) || lower(col2)) from table1",
         new String[]{"48"});
   }
@@ -467,10 +489,11 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select strpos('일이삼사오육','삼사') as col1 ", new String[]{"3"});
     testSimpleEval("select strpos('일이삼사오육','일이삼') as col1 ", new String[]{"1"});
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", "ABCDEF,HIJKLMN,3.14", "select strpos(lower(col1) || lower(col2), 'fh') from table1",
         new String[]{"6"});
   }
@@ -483,10 +506,11 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
-    schema.addColumn("col3", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
     testEval(schema, "table1", "ABCDEF,HIJKLMN,3.14", "select strposb(lower(col1) || lower(col2), 'fh') from table1",
         new String[]{"6"});
   }
@@ -501,8 +525,9 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
   public void testAscii() throws TajoException {
     testSimpleEval("select ascii('abc') as col1 ", new String[]{"97"});
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .build();
     testEval(schema, "table1", "abc", "select ascii(col1) from table1",
             new String[]{"97"});
     testEval(schema, "table1", "12", "select ascii(col1) from table1",
@@ -517,8 +542,8 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select chr(50) as col1 ", new String[]{"2"});
     testSimpleEval("select chr(64) as col1 ", new String[]{"@"});
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", INT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", INT4).build();
     testEval(schema, "table1", "65", "select chr(col1) from table1", new String[]{"A"});
     testEval(schema, "table1", "66", "select chr(col1) from table1", new String[]{"B"});
     testEval(schema, "table1", "52512", "select chr(col1) from table1", new String[]{"촠"});
@@ -588,9 +613,10 @@ public class TestStringOperatorsAndFunctions extends ExprTestBase {
     testSimpleEval("select find_in_set('딸기','사과,배,옥수수,감자,딸기,수박') as col1 ", new String[]{"5"});
 
     // null test
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .build();
     testEval(schema, "table1", "|crt,c,cr,c,def", "select find_in_set(col1, col2) is null from table1",
         new String[]{"t"}, '|', true);
     testEval(schema, "table1", "cr|", "select find_in_set(col1, col2) is null from table1",

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 f66c6bb..4150289 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,7 +19,7 @@
 package org.apache.tajo.engine.function;
 
 import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.SchemaFactory;
+import org.apache.tajo.catalog.SchemaBuilder;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
 import org.apache.tajo.exception.TajoException;
@@ -36,8 +36,9 @@ public class TestUserDefinedFunctions extends ExprTestBase {
 
   @Test
   public void testNullHandling2() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", BOOLEAN);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", BOOLEAN)
+        .build();
 
     testEval(schema, "table1", "", "select null_test() from table1", new String[]{NullDatum.get().toString()});
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 ce5a6ab..bd9c5f9 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
@@ -28,12 +28,15 @@ import org.apache.tajo.catalog.*;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.engine.function.FunctionLoader;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.query.QueryContext;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalOptimizer;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.LogicalPlanner;
-import org.apache.tajo.plan.logical.*;
+import org.apache.tajo.plan.logical.JoinNode;
+import org.apache.tajo.plan.logical.LogicalNode;
+import org.apache.tajo.plan.logical.NodeType;
+import org.apache.tajo.plan.logical.ScanNode;
 import org.apache.tajo.plan.util.PlannerUtil;
 import org.apache.tajo.storage.TablespaceManager;
 import org.apache.tajo.unit.StorageUnit;
@@ -45,7 +48,8 @@ import org.junit.Test;
 
 import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME;
 import static org.apache.tajo.TajoConstants.DEFAULT_TABLESPACE_NAME;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 public class TestJoinOrderAlgorithm {
 
@@ -67,19 +71,22 @@ public class TestJoinOrderAlgorithm {
       catalog.createFunction(funcDesc);
     }
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("name", Type.TEXT);
-    schema.addColumn("empid", Type.INT4);
-    schema.addColumn("deptname", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("name", Type.TEXT)
+        .add("empid", Type.INT4)
+        .add("deptname", Type.TEXT)
+        .build();
 
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("deptname", Type.TEXT);
-    schema2.addColumn("manager", Type.TEXT);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("deptname", Type.TEXT)
+        .add("manager", Type.TEXT)
+        .build();
 
-    Schema schema3 = SchemaFactory.newV1();
-    schema3.addColumn("deptname", Type.TEXT);
-    schema3.addColumn("score", Type.INT4);
-    schema3.addColumn("phone", Type.INT4);
+    Schema schema3 = SchemaBuilder.builder()
+        .add("deptname", Type.TEXT)
+        .add("score", Type.INT4)
+        .add("phone", Type.INT4)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta("TEXT");
     TableDesc people = new TableDesc(
@@ -101,9 +108,10 @@ public class TestJoinOrderAlgorithm {
 
     ///////////////////////////////////////////////////////////////////////////
     // creating table for overflow in JoinOrderOptimizer.
-    Schema schema4 = SchemaFactory.newV1();
-    schema4.addColumn("deptname", Type.TEXT);
-    schema4.addColumn("manager", Type.TEXT);
+    Schema schema4 = SchemaBuilder.builder()
+        .add("deptname", Type.TEXT)
+        .add("manager", Type.TEXT)
+        .build();
     // Set store type as FAKEFILE to prevent auto update of physical information in LogicalPlanner.updatePhysicalInfo()
     TableMeta largeTableMeta = CatalogUtil.newTableMeta("FAKEFILE");
     TableDesc largeDept;

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 56ef78b..e57921d 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
@@ -27,9 +27,9 @@ import org.apache.tajo.catalog.proto.CatalogProtos.FunctionType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.engine.function.FunctionLoader;
 import org.apache.tajo.engine.function.builtin.SumInt;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalOptimizer;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.LogicalPlanner;
@@ -65,19 +65,22 @@ public class TestLogicalOptimizer {
       catalog.createFunction(funcDesc);
     }
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("name", Type.TEXT);
-    schema.addColumn("empid", Type.INT4);
-    schema.addColumn("deptname", Type.TEXT);
-
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("deptname", Type.TEXT);
-    schema2.addColumn("manager", Type.TEXT);
-
-    Schema schema3 = SchemaFactory.newV1();
-    schema3.addColumn("deptname", Type.TEXT);
-    schema3.addColumn("score", Type.INT4);
-    schema3.addColumn("phone", Type.INT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("name", Type.TEXT)
+        .add("empid", Type.INT4)
+        .add("deptname", Type.TEXT)
+        .build();
+
+    Schema schema2 = SchemaBuilder.builder()
+        .add("deptname", Type.TEXT)
+        .add("manager", Type.TEXT)
+        .build();
+
+    Schema schema3 = SchemaBuilder.builder()
+        .add("deptname", Type.TEXT)
+        .add("score", Type.INT4)
+        .add("phone", Type.INT4)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta("TEXT");
     TableDesc people = new TableDesc(

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 d09ef77..d1c8384 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,18 +86,21 @@ public class TestLogicalPlanner {
       catalog.createFunction(funcDesc);
     }
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("name", Type.TEXT);
-    schema.addColumn("empid", Type.INT4);
-    schema.addColumn("deptname", Type.TEXT);
-
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("deptname", Type.TEXT);
-    schema2.addColumn("manager", Type.TEXT);
-
-    Schema schema3 = SchemaFactory.newV1();
-    schema3.addColumn("deptname", Type.TEXT);
-    schema3.addColumn("score", Type.INT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("name", Type.TEXT)
+        .add("empid", Type.INT4)
+        .add("deptname", Type.TEXT)
+        .build();
+
+    Schema schema2 = SchemaBuilder.builder()
+        .add("deptname", Type.TEXT)
+        .add("manager", Type.TEXT)
+        .build();
+
+    Schema schema3 = SchemaBuilder.builder()
+        .add("deptname", Type.TEXT)
+        .add("score", Type.INT4)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta("TEXT");
     TableDesc people = new TableDesc(
@@ -222,11 +225,12 @@ public class TestLogicalPlanner {
     testJsonSerDerObject(root);
     testCloneLogicalNode(root);
 
-    Schema expectedSchema = SchemaFactory.newV1();
-    expectedSchema.addColumn("name", Type.TEXT);
-    expectedSchema.addColumn("empid", Type.INT4);
-    expectedSchema.addColumn("deptname", Type.TEXT);
-    expectedSchema.addColumn("manager", Type.TEXT);
+    Schema expectedSchema = SchemaBuilder.builder()
+        .add("name", Type.TEXT)
+        .add("empid", Type.INT4)
+        .add("deptname", Type.TEXT)
+        .add("manager", Type.TEXT)
+        .build();
     for (int i = 0; i < expectedSchema.size(); i++) {
       Column found = root.getOutSchema().getColumn(expectedSchema.getColumn(i).getSimpleName());
       assertEquals(expectedSchema.getColumn(i).getDataType(), found.getDataType());
@@ -251,7 +255,9 @@ public class TestLogicalPlanner {
     testJsonSerDerObject(plan);
     testCloneLogicalNode(plan);
 
-    expectedSchema.addColumn("score", Type.INT4);
+    expectedSchema = SchemaBuilder.builder().addAll(expectedSchema.getRootColumns())
+        .add("score", Type.INT4)
+        .build();
     assertSchema(expectedSchema, plan.getOutSchema());
 
     assertEquals(NodeType.ROOT, plan.getType());
@@ -291,10 +297,11 @@ public class TestLogicalPlanner {
 
   static Schema expectedJoinSchema;
   static {
-    expectedJoinSchema = SchemaFactory.newV1();
-    expectedJoinSchema.addColumn("name", Type.TEXT);
-    expectedJoinSchema.addColumn("deptname", Type.TEXT);
-    expectedJoinSchema.addColumn("score", Type.INT4);
+    expectedJoinSchema = SchemaBuilder.builder()
+        .add("name", Type.TEXT)
+        .add("deptname", Type.TEXT)
+        .add("score", Type.INT4)
+        .build();
   }
 
   @Test
@@ -1290,18 +1297,20 @@ public class TestLogicalPlanner {
     String tableName = CatalogUtil.normalizeIdentifier("partitioned_table");
     String qualifiedTableName = CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, tableName);
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4)
-      .addColumn("name", Type.TEXT)
-      .addColumn("age", Type.INT4)
-      .addColumn("score", Type.FLOAT8);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .add("age", Type.INT4)
+        .add("score", Type.FLOAT8)
+        .build();
 
     KeyValueSet opts = new KeyValueSet();
     opts.set("file.delimiter", ",");
 
-    Schema partSchema = SchemaFactory.newV1();
-    partSchema.addColumn("id", Type.INT4);
-    partSchema.addColumn("name", Type.TEXT);
+    Schema partSchema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .build();
 
     PartitionMethodDesc partitionMethodDesc =
       new PartitionMethodDesc(DEFAULT_DATABASE_NAME, tableName,

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 6479124..92557f1 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,18 +72,18 @@ public class TestPlannerUtil {
     catalog.createTablespace(DEFAULT_TABLESPACE_NAME, "hdfs://localhost:1234/warehouse");
     catalog.createDatabase(DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("name", Type.TEXT);
-    schema.addColumn("empid", CatalogUtil.newSimpleDataType(Type.INT4));
-    schema.addColumn("deptname", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("name", Type.TEXT)
+        .add("empid", CatalogUtil.newSimpleDataType(Type.INT4))
+        .add("deptname", Type.TEXT).build();
 
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("deptname", Type.TEXT);
-    schema2.addColumn("manager", Type.TEXT);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("deptname", Type.TEXT)
+        .add("manager", Type.TEXT).build();
 
-    Schema schema3 = SchemaFactory.newV1();
-    schema3.addColumn("deptname", Type.TEXT);
-    schema3.addColumn("score", CatalogUtil.newSimpleDataType(Type.INT4));
+    Schema schema3 = SchemaBuilder.builder()
+        .add("deptname", Type.TEXT)
+        .add("score", CatalogUtil.newSimpleDataType(Type.INT4)).build();
 
     TableMeta meta = CatalogUtil.newTableMeta("TEXT");
     TableDesc people = new TableDesc(
@@ -188,12 +188,12 @@ public class TestPlannerUtil {
 
   @Test
   public final void testGetJoinKeyPairs() {
-    Schema outerSchema = SchemaFactory.newV1();
-    outerSchema.addColumn("employee.id1", CatalogUtil.newSimpleDataType(Type.INT4));
-    outerSchema.addColumn("employee.id2", CatalogUtil.newSimpleDataType(Type.INT4));
-    Schema innerSchema = SchemaFactory.newV1();
-    innerSchema.addColumn("people.fid1", CatalogUtil.newSimpleDataType(Type.INT4));
-    innerSchema.addColumn("people.fid2", CatalogUtil.newSimpleDataType(Type.INT4));
+    Schema outerSchema = SchemaBuilder.builder()
+        .add("employee.id1", CatalogUtil.newSimpleDataType(Type.INT4))
+        .add("employee.id2", CatalogUtil.newSimpleDataType(Type.INT4)).build();
+    Schema innerSchema = SchemaBuilder.builder()
+        .add("people.fid1", CatalogUtil.newSimpleDataType(Type.INT4))
+        .add("people.fid2", CatalogUtil.newSimpleDataType(Type.INT4)).build();
 
     FieldEval f1 = new FieldEval("employee.id1", CatalogUtil.newSimpleDataType(Type.INT4));
     FieldEval f2 = new FieldEval("people.fid1", CatalogUtil.newSimpleDataType(Type.INT4));
@@ -250,12 +250,14 @@ public class TestPlannerUtil {
 
   @Test
   public final void testGetSortKeysFromJoinQual() {
-    Schema outerSchema = SchemaFactory.newV1();
-    outerSchema.addColumn("employee.id1", CatalogUtil.newSimpleDataType(Type.INT4));
-    outerSchema.addColumn("employee.id2", CatalogUtil.newSimpleDataType(Type.INT4));
-    Schema innerSchema = SchemaFactory.newV1();
-    innerSchema.addColumn("people.fid1", CatalogUtil.newSimpleDataType(Type.INT4));
-    innerSchema.addColumn("people.fid2", CatalogUtil.newSimpleDataType(Type.INT4));
+    Schema outerSchema = SchemaBuilder.builder()
+        .add("employee.id1", CatalogUtil.newSimpleDataType(Type.INT4))
+        .add("employee.id2", CatalogUtil.newSimpleDataType(Type.INT4))
+        .build();
+    Schema innerSchema = SchemaBuilder.builder()
+        .add("people.fid1", CatalogUtil.newSimpleDataType(Type.INT4))
+        .add("people.fid2", CatalogUtil.newSimpleDataType(Type.INT4))
+        .build();
 
     FieldEval f1 = new FieldEval("employee.id1", CatalogUtil.newSimpleDataType(Type.INT4));
     FieldEval f2 = new FieldEval("people.fid1", CatalogUtil.newSimpleDataType(Type.INT4));
@@ -286,12 +288,14 @@ public class TestPlannerUtil {
 
   @Test
   public final void testComparatorsFromJoinQual() {
-    Schema outerSchema = SchemaFactory.newV1();
-    outerSchema.addColumn("employee.id1", CatalogUtil.newSimpleDataType(Type.INT4));
-    outerSchema.addColumn("employee.id2", CatalogUtil.newSimpleDataType(Type.INT4));
-    Schema innerSchema = SchemaFactory.newV1();
-    innerSchema.addColumn("people.fid1", CatalogUtil.newSimpleDataType(Type.INT4));
-    innerSchema.addColumn("people.fid2", CatalogUtil.newSimpleDataType(Type.INT4));
+    Schema outerSchema = SchemaBuilder.builder()
+        .add("employee.id1", CatalogUtil.newSimpleDataType(Type.INT4))
+        .add("employee.id2", CatalogUtil.newSimpleDataType(Type.INT4))
+        .build();
+    Schema innerSchema = SchemaBuilder.builder()
+        .add("people.fid1", CatalogUtil.newSimpleDataType(Type.INT4))
+        .add("people.fid2", CatalogUtil.newSimpleDataType(Type.INT4))
+        .build();
 
     FieldEval f1 = new FieldEval("employee.id1", CatalogUtil.newSimpleDataType(Type.INT4));
     FieldEval f2 = new FieldEval("people.fid1", CatalogUtil.newSimpleDataType(Type.INT4));


[2/6] tajo git commit: TAJO-2108: Refactor Schema to be immutable.

Posted by hy...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 ef3336d..0cc93da 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,7 +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.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf.ConfVars;
 import org.apache.tajo.storage.StorageConstants;
@@ -133,9 +133,10 @@ public class TestSortQuery extends QueryTestCaseBase {
       tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
       tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-      Schema schema = SchemaFactory.newV1();
-      schema.addColumn("col1", Type.INT4);
-      schema.addColumn("col2", Type.TEXT);
+      Schema schema = SchemaBuilder.builder()
+          .add("col1", Type.INT4)
+          .add("col2", Type.TEXT)
+          .build();
       String[] data = new String[]{
           "1|abc",
           "3|dfa",
@@ -239,9 +240,10 @@ public class TestSortQuery extends QueryTestCaseBase {
       tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
       tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-      Schema schema = SchemaFactory.newV1();
-      schema.addColumn("id", Type.INT4);
-      schema.addColumn("name", Type.TEXT);
+      Schema schema = SchemaBuilder.builder()
+          .add("id", Type.INT4)
+          .add("name", Type.TEXT)
+          .build();
       String[] data = new String[]{
           "1|BRAZIL",
           "2|ALGERIA",
@@ -265,9 +267,10 @@ public class TestSortQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .build();
     String[] data = new String[]{ "1|111", "2|\\N", "3|333" };
     TajoTestingCluster.createTable("testSortOnNullColumn2".toLowerCase(), schema, tableOptions, data, 1);
 
@@ -302,9 +305,10 @@ public class TestSortQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .build();
     String[] data = new String[]{ "1|111", "2|\\N", "3|333" };
     TajoTestingCluster.createTable("testSortOnNullColumn3".toLowerCase(), schema, tableOptions, data, 1);
 
@@ -330,9 +334,10 @@ public class TestSortQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .build();
     String[] data = new String[]{ "1|111", "2|\\N", "3|333" };
     TajoTestingCluster.createTable("testSortOnNullColumn4".toLowerCase(), schema, tableOptions, data, 1);
 
@@ -358,9 +363,10 @@ public class TestSortQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("name", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .build();
     String[] data = new String[]{ "1|111", "2|\\N", "3|333" };
     TajoTestingCluster.createTable("testSortOnNullColumn5".toLowerCase(), schema, tableOptions, data, 1);
 
@@ -388,9 +394,10 @@ public class TestSortQuery extends QueryTestCaseBase {
       tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
       tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-      Schema schema = SchemaFactory.newV1();
-      schema.addColumn("col1", Type.INT4);
-      schema.addColumn("col2", Type.TEXT);
+      Schema schema = SchemaBuilder.builder()
+          .add("col1", Type.INT4)
+          .add("col2", Type.TEXT)
+          .build();
       String[] data = new String[]{
           "1|하하하",
           "2|캬캬캬",
@@ -416,9 +423,10 @@ public class TestSortQuery extends QueryTestCaseBase {
       tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
       tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-      Schema schema = SchemaFactory.newV1();
-      schema.addColumn("col1", Type.INT4);
-      schema.addColumn("col2", Type.TEXT);
+      Schema schema = SchemaBuilder.builder()
+          .add("col1", Type.INT4)
+          .add("col2", Type.TEXT)
+          .build();
       String[] data = new String[]{
           "1|하하하",
           "2|캬캬캬",

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 3438759..196b488 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
@@ -23,16 +23,19 @@ import org.apache.hadoop.fs.*;
 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.QueryId;
+import org.apache.tajo.QueryTestCaseBase;
+import org.apache.tajo.TajoConstants;
+import org.apache.tajo.TajoTestingCluster;
 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;
+import org.apache.tajo.client.TajoClientUtil;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.engine.planner.global.DataChannel;
 import org.apache.tajo.engine.planner.global.ExecutionBlock;
 import org.apache.tajo.engine.planner.global.MasterPlan;
+import org.apache.tajo.exception.ReturnStateUtil;
 import org.apache.tajo.ipc.ClientProtos;
 import org.apache.tajo.plan.logical.NodeType;
 import org.apache.tajo.querymaster.QueryMasterTask;
@@ -1091,9 +1094,10 @@ public class TestTablePartitions extends QueryTestCaseBase {
       tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
       tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-      Schema schema = SchemaFactory.newV1();
-      schema.addColumn("col1", TajoDataTypes.Type.TEXT);
-      schema.addColumn("col2", TajoDataTypes.Type.TEXT);
+      Schema schema = SchemaBuilder.builder()
+          .add("col1", TajoDataTypes.Type.TEXT)
+          .add("col2", TajoDataTypes.Type.TEXT)
+          .build();
 
       List<String> data = new ArrayList<>();
       int totalBytes = 0;

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 19b8bbc..54aa41e 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,7 +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.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.storage.StorageConstants;
 import org.apache.tajo.util.KeyValueSet;
@@ -266,9 +266,10 @@ public class TestWindowQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("time", TajoDataTypes.Type.TIME);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("time", TajoDataTypes.Type.TIME)
+        .build();
     String[] data = new String[]{ "1|12:11:12", "2|10:11:13", "2|05:42:41" };
     TajoTestingCluster.createTable("firstvaluetime", schema, tableOptions, data, 1);
 
@@ -301,9 +302,10 @@ public class TestWindowQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("time", TajoDataTypes.Type.TIME);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("time", TajoDataTypes.Type.TIME)
+        .build();
     String[] data = new String[]{ "1|12:11:12", "2|10:11:13", "2|05:42:41" };
     TajoTestingCluster.createTable("lastvaluetime", schema, tableOptions, data, 1);
 
@@ -336,9 +338,10 @@ public class TestWindowQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("time", TajoDataTypes.Type.TIME);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("time", TajoDataTypes.Type.TIME)
+        .build();
     String[] data = new String[]{ "1|12:11:12", "2|10:11:13", "2|05:42:41" };
     TajoTestingCluster.createTable("lagtime", schema, tableOptions, data, 1);
 
@@ -385,9 +388,10 @@ public class TestWindowQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("time", TajoDataTypes.Type.TIME);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("time", TajoDataTypes.Type.TIME)
+        .build();
     String[] data = new String[]{ "1|12:11:12", "2|10:11:13", "2|05:42:41" };
     TajoTestingCluster.createTable("leadtime", schema, tableOptions, data, 1);
 
@@ -441,10 +445,11 @@ public class TestWindowQuery extends QueryTestCaseBase {
     tableOptions.set(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     tableOptions.set(StorageConstants.TEXT_NULL, "\\\\N");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", TajoDataTypes.Type.INT4);
-    schema.addColumn("time", TajoDataTypes.Type.TIME);
-    schema.addColumn("name", TajoDataTypes.Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", TajoDataTypes.Type.INT4)
+        .add("time", TajoDataTypes.Type.TIME)
+        .add("name", TajoDataTypes.Type.TEXT)
+        .build();
     String[] data = new String[]{ "1|12:11:12|abc", "2|10:11:13|def", "2|05:42:41|ghi" };
     TajoTestingCluster.createTable("multiwindow", schema, tableOptions, data, 1);
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/BenchmarkSort.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/BenchmarkSort.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/BenchmarkSort.java
index 1cc526f..d681d11 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/BenchmarkSort.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/util/BenchmarkSort.java
@@ -96,7 +96,7 @@ public class BenchmarkSort {
     catalog.createDatabase(TajoConstants.DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
     conf.setVar(TajoConf.ConfVars.WORKER_TEMPORAL_DIR, testDir.toString());
 
-    Schema schema = SchemaFactory.newV1(new Column[] {
+    Schema schema = SchemaBuilder.builder().addAll(new Column[] {
         new Column("col0", Type.INT8),
         new Column("col1", Type.INT4),
         new Column("col2", Type.INT2),
@@ -112,7 +112,7 @@ public class BenchmarkSort {
         new Column("col12", Type.INT8),
         new Column("col13", Type.INT8),
         new Column("col14", Type.INT8),
-    });
+    }).build();
 
     TableMeta employeeMeta = CatalogUtil.newTableMeta("TEXT");
     Path employeePath = new Path(testDir, "employee.csv");

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 5683c7a..dff63c4 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
@@ -19,16 +19,17 @@
 package org.apache.tajo.engine.util;
 
 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.SchemaBuilder;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
-import org.apache.tajo.plan.util.PlannerUtil;
 import org.apache.tajo.engine.planner.RangePartitionAlgorithm;
 import org.apache.tajo.engine.planner.UniformRangePartition;
 import org.apache.tajo.plan.rewrite.rules.PartitionedTableRewriter;
+import org.apache.tajo.plan.util.PlannerUtil;
 import org.apache.tajo.storage.*;
 import org.apache.tajo.storage.RowStoreUtil.RowStoreDecoder;
 import org.apache.tajo.storage.RowStoreUtil.RowStoreEncoder;
@@ -39,8 +40,7 @@ import static org.junit.Assert.*;
 public class TestTupleUtil {
   @Test
   public final void testFixedSizeChar() {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.CHAR, 5);
+    Schema schema = SchemaBuilder.builder().add("col1", CatalogUtil.newDataTypeWithLen(Type.CHAR, 5)).build();
 
     Tuple tuple = new VTuple(1);
     tuple.put(new Datum[] {
@@ -57,23 +57,22 @@ public class TestTupleUtil {
 
   @Test
   public final void testToBytesAndToTuple() {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", Type.BOOLEAN);
-    schema.addColumn("col2", Type.BIT);
-    schema.addColumn("col3", Type.CHAR);
-    schema.addColumn("col4", Type.INT2);
-    schema.addColumn("col5", Type.INT4);
-    schema.addColumn("col6", Type.INT8);
-    schema.addColumn("col7", Type.FLOAT4);
-    schema.addColumn("col8", Type.FLOAT8);
-    schema.addColumn("col9", Type.TEXT);
-    schema.addColumn("col10", Type.BLOB);
-    schema.addColumn("col11", Type.INET4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", Type.BOOLEAN)
+        .add("col2", Type.CHAR)
+        .add("col3", Type.INT2)
+        .add("col4", Type.INT4)
+        .add("col5", Type.INT8)
+        .add("col6", Type.FLOAT4)
+        .add("col7", Type.FLOAT8)
+        .add("col8", Type.TEXT)
+        .add("col9", Type.BLOB)
+        .add("col10", Type.INET4)
+        .build();
     //schema.addColumn("col11", DataType.IPv6);
     
     Tuple tuple = new VTuple(new Datum[] {
         DatumFactory.createBool(true),
-        DatumFactory.createBit((byte) 0x99),
         DatumFactory.createChar('7'),
         DatumFactory.createInt2((short) 17),
         DatumFactory.createInt4(59),
@@ -95,41 +94,38 @@ public class TestTupleUtil {
 
   @Test
   public final void testGetPartitions() {
-    VTuple sTuple = new VTuple(7);
-    VTuple eTuple = new VTuple(7);
-
-    Schema schema = SchemaFactory.newV1();
-
-    schema.addColumn("numByte", Type.BIT);
-    schema.addColumn("numChar", Type.CHAR);
-    schema.addColumn("numShort", Type.INT2);
-    schema.addColumn("numInt", Type.INT4);
-    schema.addColumn("numLong", Type.INT8);
-    schema.addColumn("numFloat", Type.FLOAT4);
-    schema.addColumn("numDouble", Type.FLOAT4);
+    VTuple sTuple = new VTuple(6);
+    VTuple eTuple = new VTuple(6);
+
+    Schema schema = SchemaBuilder.builder()
+        .add("numChar", Type.CHAR)
+        .add("numShort", Type.INT2)
+        .add("numInt", Type.INT4)
+        .add("numLong", Type.INT8)
+        .add("numFloat", Type.FLOAT4)
+        .add("numDouble", Type.FLOAT4)
+        .build();
 
     SortSpec[] sortSpecs = PlannerUtil.schemaToSortSpecs(schema);
 
-    sTuple.put(0, DatumFactory.createBit((byte) 44));
-    sTuple.put(1, DatumFactory.createChar('a'));
-    sTuple.put(2, DatumFactory.createInt2((short) 10));
-    sTuple.put(3, DatumFactory.createInt4(5));
-    sTuple.put(4, DatumFactory.createInt8(100));
-    sTuple.put(5, DatumFactory.createFloat4(100));
-    sTuple.put(6, DatumFactory.createFloat8(100));
-
-    eTuple.put(0, DatumFactory.createBit((byte) 99));
-    eTuple.put(1, DatumFactory.createChar('p'));
-    eTuple.put(2, DatumFactory.createInt2((short) 70));
-    eTuple.put(3, DatumFactory.createInt4(70));
-    eTuple.put(4, DatumFactory.createInt8(10000));
-    eTuple.put(5, DatumFactory.createFloat4(150));
-    eTuple.put(6, DatumFactory.createFloat8(170));
+    sTuple.put(0, DatumFactory.createChar('a'));
+    sTuple.put(1, DatumFactory.createInt2((short) 10));
+    sTuple.put(2, DatumFactory.createInt4(5));
+    sTuple.put(3, DatumFactory.createInt8(100));
+    sTuple.put(4, DatumFactory.createFloat4(100));
+    sTuple.put(5, DatumFactory.createFloat8(100));
+
+    eTuple.put(0, DatumFactory.createChar('p'));
+    eTuple.put(1, DatumFactory.createInt2((short) 70));
+    eTuple.put(2, DatumFactory.createInt4(70));
+    eTuple.put(3, DatumFactory.createInt8(10000));
+    eTuple.put(4, DatumFactory.createFloat4(150));
+    eTuple.put(5, DatumFactory.createFloat8(170));
 
     RangePartitionAlgorithm partitioner = new UniformRangePartition(new TupleRange(sortSpecs, sTuple, eTuple),
         sortSpecs);
-    TupleRange [] ranges = partitioner.partition(5);
-    assertTrue(5 <= ranges.length);
+    TupleRange [] ranges = partitioner.partition(4);
+    assertTrue(4 <= ranges.length);
     BaseTupleComparator comp = new BaseTupleComparator(schema, PlannerUtil.schemaToSortSpecs(schema));
     TupleRange prev = ranges[0];
     for (int i = 1; i < ranges.length; i++) {
@@ -142,9 +138,10 @@ public class TestTupleUtil {
   @Test
   public void testBuildTupleFromPartitionPath() {
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("key1", Type.INT8);
-    schema.addColumn("key2", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("key1", Type.INT8)
+        .add("key2", Type.TEXT)
+        .build();
 
     Path path = new Path("hdfs://tajo/warehouse/partition_test/");
     Tuple tuple = PartitionedTableRewriter.buildTupleFromPartitionPath(schema, path, true);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 25f0e61..cce0f4c 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -63,10 +63,11 @@ public class TestRowFile {
 
   @Test
   public void test() throws IOException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("age", Type.INT8);
-    schema.addColumn("description", Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("age", Type.INT8)
+        .add("description", Type.TEXT)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta("ROWFILE");
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-core-tests/src/test/resources/queries/TestCreateTable/create_table_various_types.sql
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/queries/TestCreateTable/create_table_various_types.sql b/tajo-core-tests/src/test/resources/queries/TestCreateTable/create_table_various_types.sql
index 891a139..bfa5e97 100644
--- a/tajo-core-tests/src/test/resources/queries/TestCreateTable/create_table_various_types.sql
+++ b/tajo-core-tests/src/test/resources/queries/TestCreateTable/create_table_various_types.sql
@@ -1,10 +1,10 @@
 -- Some types were commented out due to Hive meta test.
 
 create table various_types (
-  col0 bit,
-  col1 BIT(10),
-  col2 bit varying,
-  col3 bit VARYING(10),
+  -- col0 bit,
+  -- col1 BIT(10),
+  -- col2 bit varying,
+  -- col3 bit VARYING(10),
   col4 tinyint,
   col5 smallInt,
   col6 integer,
@@ -38,13 +38,13 @@ create table various_types (
   col34 national character varying (255),
   col35 date,
   col36 time,
-  col37 timetz,
-  col38 time With time zone,
-  col39 timesTamptz,
-  col40 timestamp with time zone,
-  col41 binary,
-  col42 binary(10),
-  col43 varbinary(10),
-  col44 binary Varying(10),
+  -- col37 timetz,
+  -- col38 time With time zone,
+  -- col39 timesTamptz,
+  -- col40 timestamp with time zone,
+  -- col41 binary,
+  -- col42 binary(10),
+  -- col43 varbinary(10),
+  -- col44 binary Varying(10),
   col45 blOb
 );
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 9ccfeb7..3ff773b 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.partition.PartitionMethodDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
@@ -70,117 +70,125 @@ public class TPCH extends BenchmarkSet {
 
   @Override
   public void loadSchemas() {
-    Schema lineitem = SchemaFactory.newV1()
-        .addColumn("l_orderkey", Type.INT4) // 0
-        .addColumn("l_partkey", Type.INT4) // 1
-        .addColumn("l_suppkey", Type.INT4) // 2
-        .addColumn("l_linenumber", Type.INT4) // 3
-        .addColumn("l_quantity", Type.FLOAT8) // 4
-        .addColumn("l_extendedprice", Type.FLOAT8) // 5
-        .addColumn("l_discount", Type.FLOAT8) // 6
-        .addColumn("l_tax", Type.FLOAT8) // 7
+    schemas.put(LINEITEM, SchemaBuilder.builder()
+        .add("l_orderkey", Type.INT4) // 0
+        .add("l_partkey", Type.INT4) // 1
+        .add("l_suppkey", Type.INT4) // 2
+        .add("l_linenumber", Type.INT4) // 3
+        .add("l_quantity", Type.FLOAT8) // 4
+        .add("l_extendedprice", Type.FLOAT8) // 5
+        .add("l_discount", Type.FLOAT8) // 6
+        .add("l_tax", Type.FLOAT8) // 7
             // TODO - This is temporal solution. 8 and 9 are actually Char type.
-        .addColumn("l_returnflag", Type.TEXT) // 8
-        .addColumn("l_linestatus", Type.TEXT) // 9
+        .add("l_returnflag", Type.TEXT) // 8
+        .add("l_linestatus", Type.TEXT) // 9
             // TODO - This is temporal solution. 10,11, and 12 are actually Date type.
-        .addColumn("l_shipdate", Type.TEXT) // 10
-        .addColumn("l_commitdate", Type.TEXT) // 11
-        .addColumn("l_receiptdate", Type.TEXT) // 12
-        .addColumn("l_shipinstruct", Type.TEXT) // 13
-        .addColumn("l_shipmode", Type.TEXT) // 14
-        .addColumn("l_comment", Type.TEXT); // 15
-    schemas.put(LINEITEM, lineitem);
-
-    Schema customer = SchemaFactory.newV1()
-        .addColumn("c_custkey", Type.INT4) // 0
-        .addColumn("c_name", Type.TEXT) // 1
-        .addColumn("c_address", Type.TEXT) // 2
-        .addColumn("c_nationkey", Type.INT4) // 3
-        .addColumn("c_phone", Type.TEXT) // 4
-        .addColumn("c_acctbal", Type.FLOAT8) // 5
-        .addColumn("c_mktsegment", Type.TEXT) // 6
-        .addColumn("c_comment", Type.TEXT); // 7
-    schemas.put(CUSTOMER, customer);
-
-    Schema customerParts = SchemaFactory.newV1()
-        .addColumn("c_custkey", Type.INT4) // 0
-        .addColumn("c_name", Type.TEXT) // 1
-        .addColumn("c_address", Type.TEXT) // 2
-        .addColumn("c_phone", Type.TEXT) // 3
-        .addColumn("c_acctbal", Type.FLOAT8) // 4
-        .addColumn("c_mktsegment", Type.TEXT) // 5
-        .addColumn("c_comment", Type.TEXT); // 6
-    schemas.put(CUSTOMER_PARTS, customerParts);
-
-    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 = SchemaFactory.newV1()
-        .addColumn("p_partkey", Type.INT4) // 0
-        .addColumn("p_name", Type.TEXT) // 1
-        .addColumn("p_mfgr", Type.TEXT) // 2
-        .addColumn("p_brand", Type.TEXT) // 3
-        .addColumn("p_type", Type.TEXT) // 4
-        .addColumn("p_size", Type.INT4) // 5
-        .addColumn("p_container", Type.TEXT) // 6
-        .addColumn("p_retailprice", Type.FLOAT8) // 7
-        .addColumn("p_comment", Type.TEXT); // 8
-    schemas.put(PART, part);
-
-    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 = SchemaFactory.newV1()
-        .addColumn("o_orderkey", Type.INT4) // 0
-        .addColumn("o_custkey", Type.INT4) // 1
-        .addColumn("o_orderstatus", Type.TEXT) // 2
-        .addColumn("o_totalprice", Type.FLOAT8) // 3
-            // TODO - This is temporal solution. o_orderdate is actually Date type.
-        .addColumn("o_orderdate", Type.TEXT) // 4
-        .addColumn("o_orderpriority", Type.TEXT) // 5
-        .addColumn("o_clerk", Type.TEXT) // 6
-        .addColumn("o_shippriority", Type.INT4) // 7
-        .addColumn("o_comment", Type.TEXT); // 8
+        .add("l_shipdate", Type.TEXT) // 10
+        .add("l_commitdate", Type.TEXT) // 11
+        .add("l_receiptdate", Type.TEXT) // 12
+        .add("l_shipinstruct", Type.TEXT) // 13
+        .add("l_shipmode", Type.TEXT) // 14
+        .add("l_comment", Type.TEXT) // 15
+        .build());
+
+    schemas.put(CUSTOMER, SchemaBuilder.builder()
+        .add("c_custkey", Type.INT4) // 0
+        .add("c_name", Type.TEXT) // 1
+        .add("c_address", Type.TEXT) // 2
+        .add("c_nationkey", Type.INT4) // 3
+        .add("c_phone", Type.TEXT) // 4
+        .add("c_acctbal", Type.FLOAT8) // 5
+        .add("c_mktsegment", Type.TEXT) // 6
+        .add("c_comment", Type.TEXT) // 7
+        .build());
+
+
+    schemas.put(CUSTOMER_PARTS, SchemaBuilder.builder()
+        .add("c_custkey", Type.INT4) // 0
+        .add("c_name", Type.TEXT) // 1
+        .add("c_address", Type.TEXT) // 2
+        .add("c_phone", Type.TEXT) // 3
+        .add("c_acctbal", Type.FLOAT8) // 4
+        .add("c_mktsegment", Type.TEXT) // 5
+        .add("c_comment", Type.TEXT) // 6
+        .build());
+
+
+    schemas.put(NATION, SchemaBuilder.builder()
+        .add("n_nationkey", Type.INT4) // 0
+        .add("n_name", Type.TEXT) // 1
+        .add("n_regionkey", Type.INT4) // 2
+        .add("n_comment", Type.TEXT) // 3
+        .build());
+
+
+    schemas.put(PART, SchemaBuilder.builder()
+        .add("p_partkey", Type.INT4) // 0
+        .add("p_name", Type.TEXT) // 1
+        .add("p_mfgr", Type.TEXT) // 2
+        .add("p_brand", Type.TEXT) // 3
+        .add("p_type", Type.TEXT) // 4
+        .add("p_size", Type.INT4) // 5
+        .add("p_container", Type.TEXT) // 6
+        .add("p_retailprice", Type.FLOAT8) // 7
+        .add("p_comment", Type.TEXT) // 8
+        .build());
+
+
+    schemas.put(REGION, SchemaBuilder.builder()
+        .add("r_regionkey", Type.INT4) // 0
+        .add("r_name", Type.TEXT) // 1
+        .add("r_comment", Type.TEXT) // 2
+        .build());
+
+
+    Schema orders = SchemaBuilder.builder()
+        .add("o_orderkey", Type.INT4) // 0
+        .add("o_custkey", Type.INT4) // 1
+        .add("o_orderstatus", Type.TEXT) // 2
+        .add("o_totalprice", Type.FLOAT8) // 3
+        // TODO - This is temporal solution. o_orderdate is actually Date type.
+        .add("o_orderdate", Type.TEXT) // 4
+        .add("o_orderpriority", Type.TEXT) // 5
+        .add("o_clerk", Type.TEXT) // 6
+        .add("o_shippriority", Type.INT4) // 7
+        .add("o_comment", Type.TEXT) // 8
+        .build();
     schemas.put(ORDERS, orders);
     schemas.put(EMPTY_ORDERS, orders);
 
 
-    Schema partsupp = SchemaFactory.newV1()
-        .addColumn("ps_partkey", Type.INT4) // 0
-        .addColumn("ps_suppkey", Type.INT4) // 1
-        .addColumn("ps_availqty", Type.INT4) // 2
-        .addColumn("ps_supplycost", Type.FLOAT8) // 3
-        .addColumn("ps_comment", Type.TEXT); // 4
-    schemas.put(PARTSUPP, partsupp);
-
-    Schema supplier = SchemaFactory.newV1()
-        .addColumn("s_suppkey", Type.INT4) // 0
-        .addColumn("s_name", Type.TEXT) // 1
-        .addColumn("s_address", Type.TEXT) // 2
-        .addColumn("s_nationkey", Type.INT4) // 3
-        .addColumn("s_phone", Type.TEXT) // 4
-        .addColumn("s_acctbal", Type.FLOAT8) // 5
-        .addColumn("s_comment", Type.TEXT); // 6
-    schemas.put(SUPPLIER, supplier);
+    schemas.put(PARTSUPP, SchemaBuilder.builder()
+        .add("ps_partkey", Type.INT4) // 0
+        .add("ps_suppkey", Type.INT4) // 1
+        .add("ps_availqty", Type.INT4) // 2
+        .add("ps_supplycost", Type.FLOAT8) // 3
+        .add("ps_comment", Type.TEXT) // 4
+        .build());
+
+
+    schemas.put(SUPPLIER, SchemaBuilder.builder()
+        .add("s_suppkey", Type.INT4) // 0
+        .add("s_name", Type.TEXT) // 1
+        .add("s_address", Type.TEXT) // 2
+        .add("s_nationkey", Type.INT4) // 3
+        .add("s_phone", Type.TEXT) // 4
+        .add("s_acctbal", Type.FLOAT8) // 5
+        .add("s_comment", Type.TEXT) // 6
+        .build());
   }
 
   public void loadOutSchema() {
-    Schema q2 = SchemaFactory.newV1()
-        .addColumn("s_acctbal", Type.FLOAT8)
-        .addColumn("s_name", Type.TEXT)
-        .addColumn("n_name", Type.TEXT)
-        .addColumn("p_partkey", Type.INT4)
-        .addColumn("p_mfgr", Type.TEXT)
-        .addColumn("s_address", Type.TEXT)
-        .addColumn("s_phone", Type.TEXT)
-        .addColumn("s_comment", Type.TEXT);
+    Schema q2 = SchemaBuilder.builder()
+        .add("s_acctbal", Type.FLOAT8)
+        .add("s_name", Type.TEXT)
+        .add("n_name", Type.TEXT)
+        .add("p_partkey", Type.INT4)
+        .add("p_mfgr", Type.TEXT)
+        .add("s_address", Type.TEXT)
+        .add("s_phone", Type.TEXT)
+        .add("s_comment", Type.TEXT)
+        .build();
     outSchemas.put("q2", q2);
   }
 
@@ -208,8 +216,8 @@ public class TPCH extends BenchmarkSet {
 
     PartitionMethodDesc partitionMethodDesc = null;
     if (tableName.equals(CUSTOMER_PARTS)) {
-      Schema expressionSchema = SchemaFactory.newV1();
-      expressionSchema.addColumn("c_nationkey", TajoDataTypes.Type.INT4);
+      Schema expressionSchema = SchemaBuilder.builder()
+      .add("c_nationkey", TajoDataTypes.Type.INT4).build();
       partitionMethodDesc = new PartitionMethodDesc(
           tajo.getCurrentDatabase(),
           CUSTOMER_PARTS,

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 eb8f7ad..720c337 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.SchemaBuilder;
 import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.proto.CatalogProtos.SortSpecProto;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -645,18 +646,17 @@ public class DistinctGroupbyBuilder {
     //Set SecondStage ColumnId and Input schema
     secondStageDistinctNode.setResultColumnIds(secondStageColumnIds);
 
-    Schema secondStageInSchema = SchemaFactory.newV1();
+    SchemaBuilder secondStageInSchema = SchemaBuilder.uniqueNameBuilder();
+
     //TODO merged tuple schema
     int index = 0;
     for(GroupbyNode eachNode: secondStageDistinctNode.getSubPlans()) {
       eachNode.setInSchema(firstStageDistinctNode.getOutSchema());
       for (Column column: eachNode.getOutSchema().getRootColumns()) {
-        if (secondStageInSchema.getColumn(column) == null) {
-          secondStageInSchema.addColumn(column);
-        }
+        secondStageInSchema.add(column);
       }
     }
-    secondStageDistinctNode.setInSchema(secondStageInSchema);
+    secondStageDistinctNode.setInSchema(secondStageInSchema.build());
 
     return new DistinctGroupbyNode[]{firstStageDistinctNode, secondStageDistinctNode};
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 8002989..3be1d36 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
@@ -20,10 +20,7 @@ package org.apache.tajo.engine.planner.physical;
 
 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.*;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.catalog.proto.CatalogProtos.FragmentProto;
 import org.apache.tajo.catalog.statistics.TableStats;
@@ -43,6 +40,7 @@ import java.io.IOException;
 import java.net.URI;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 
 public class BSTIndexScanExec extends ScanExec {
@@ -94,18 +92,19 @@ public class BSTIndexScanExec extends ScanExec {
   }
 
   private static Schema mergeSubSchemas(Schema originalSchema, Schema subSchema, List<Target> targets, EvalNode qual) {
-    Schema mergedSchema = SchemaFactory.newV1();
     Set<Column> qualAndTargets = new HashSet<>();
     qualAndTargets.addAll(EvalTreeUtil.findUniqueColumns(qual));
     for (Target target : targets) {
       qualAndTargets.addAll(EvalTreeUtil.findUniqueColumns(target.getEvalTree()));
     }
+
+    SchemaBuilder mergedSchema = SchemaBuilder.builder();
     for (Column column : originalSchema.getRootColumns()) {
       if (subSchema.contains(column) || qualAndTargets.contains(column)) {
-        mergedSchema.addColumn(column);
+        mergedSchema.add(column);
       }
     }
-    return mergedSchema;
+    return mergedSchema.build();
   }
 
   @Override
@@ -127,33 +126,12 @@ public class BSTIndexScanExec extends ScanExec {
   public void init() throws IOException {
     reader.init();
 
-    Schema projected;
-
-    // in the case where projected column or expression are given
-    // the target can be an empty list.
-    if (plan.hasTargets()) {
-      projected = SchemaFactory.newV1();
-      Set<Column> columnSet = new HashSet<>();
-
-      if (plan.hasQual()) {
-        columnSet.addAll(EvalTreeUtil.findUniqueColumns(qual));
-      }
-
-      for (Target t : plan.getTargets()) {
-        columnSet.addAll(EvalTreeUtil.findUniqueColumns(t.getEvalTree()));
-      }
-
-      for (Column column : inSchema.getAllColumns()) {
-        if (columnSet.contains(column)) {
-          projected.addColumn(column);
-        }
-      }
-
-    } else {
-      // no any projected columns, meaning that all columns should be projected.
-      // TODO - this implicit rule makes code readability bad. So, we should remove it later
-      projected = outSchema;
-    }
+    final Schema projected = SeqScanExec.getProjectSchema(
+        plan.getInSchema(),
+        plan.getOutSchema(),
+        Optional.ofNullable(plan.getTargets()),
+        Optional.ofNullable(plan.getQual())
+    );
 
     initScanner(projected);
     super.init();

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 1142095..83a9ff8 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,7 +25,10 @@ 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.*;
+import org.apache.tajo.catalog.CatalogUtil;
+import org.apache.tajo.catalog.Column;
+import org.apache.tajo.catalog.SchemaBuilder;
+import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.proto.CatalogProtos.PartitionDescProto;
 import org.apache.tajo.catalog.proto.CatalogProtos.PartitionKeyProto;
 import org.apache.tajo.catalog.statistics.TableStats;
@@ -33,7 +36,10 @@ import org.apache.tajo.plan.logical.CreateTableNode;
 import org.apache.tajo.plan.logical.InsertNode;
 import org.apache.tajo.plan.logical.NodeType;
 import org.apache.tajo.plan.logical.StoreTableNode;
-import org.apache.tajo.storage.*;
+import org.apache.tajo.storage.Appender;
+import org.apache.tajo.storage.FileTablespace;
+import org.apache.tajo.storage.StorageUtil;
+import org.apache.tajo.storage.TablespaceManager;
 import org.apache.tajo.unit.StorageUnit;
 import org.apache.tajo.util.StringUtils;
 import org.apache.tajo.worker.TaskAttemptContext;
@@ -84,7 +90,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 = SchemaFactory.newV1(removedPartitionColumns);
+      this.outSchema = SchemaBuilder.builder().addAll(removedPartitionColumns).build();
     }
 
     keyIds = new int[keyNum];

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 04b23f8..dc48f3f 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
@@ -36,14 +36,13 @@ import org.apache.tajo.plan.logical.ScanNode;
 import org.apache.tajo.plan.rewrite.rules.PartitionedTableRewriter;
 import org.apache.tajo.plan.util.PlannerUtil;
 import org.apache.tajo.storage.*;
+import org.apache.tajo.storage.Scanner;
 import org.apache.tajo.storage.fragment.FileFragment;
 import org.apache.tajo.storage.fragment.FragmentConvertor;
 import org.apache.tajo.worker.TaskAttemptContext;
 
 import java.io.IOException;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 
 public class SeqScanExec extends ScanExec {
@@ -136,36 +135,37 @@ public class SeqScanExec extends ScanExec {
     }
   }
 
-  public Schema getProjectSchema() {
-    Schema projected;
+  public static Schema getProjectSchema(Schema inSchema, Schema outSchema,
+                                        Optional<Collection<Target>> targets,
+                                        Optional<EvalNode> qual) {
+    SchemaBuilder projected = SchemaBuilder.builder();
 
     // in the case where projected column or expression are given
     // the target can be an empty list.
-    if (plan.hasTargets()) {
-      projected = SchemaFactory.newV1();
+    if (targets.isPresent()) {
       Set<Column> columnSet = new HashSet<>();
 
-      if (plan.hasQual()) {
-        columnSet.addAll(EvalTreeUtil.findUniqueColumns(qual));
+      if (qual.isPresent()) {
+        columnSet.addAll(EvalTreeUtil.findUniqueColumns(qual.get()));
       }
 
-      for (Target t : plan.getTargets()) {
+      for (Target t : targets.get()) {
         columnSet.addAll(EvalTreeUtil.findUniqueColumns(t.getEvalTree()));
       }
 
       for (Column column : inSchema.getAllColumns()) {
         if (columnSet.contains(column)) {
-          projected.addColumn(column);
+          projected.add(column);
         }
       }
 
+      return projected.build();
+
     } else {
       // no any projected columns, meaning that all columns should be projected.
       // TODO - this implicit rule makes code readability bad. So, we should remove it later
-      projected = outSchema;
+      return outSchema;
     }
-
-    return projected;
   }
 
   private void initScanIterator() {
@@ -187,7 +187,12 @@ public class SeqScanExec extends ScanExec {
       scanIt = new EmptyScanIterator();
 
     } else {
-      Schema projectedFields = getProjectSchema();
+      Schema projectedFields = getProjectSchema(
+          plan.getInSchema(),
+          plan.getOutSchema(),
+          Optional.ofNullable(plan.getTargets()),
+          Optional.ofNullable(plan.getQual())
+      );
       initScanner(projectedFields);
 
       // See Scanner.isProjectable() method. Depending on the result of isProjectable(),

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 04a4a19..4b4bfeb 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.SortSpec;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.plan.expr.EvalNode;
@@ -120,7 +120,7 @@ public class WindowAggExec extends UnaryPhysicalExec {
       endCurrentRowFlags = new boolean[functions.length];
 
       List<Column> additionalSortKeyColumns = Lists.newArrayList();
-      Schema rewrittenSchema = SchemaFactory.newV1(outSchema);
+      Schema rewrittenSchema = SchemaBuilder.builder().addAll(outSchema.getRootColumns()).build();
       for (int i = 0; i < functions.length; i++) {
         WindowSpec.WindowEndBound endBound = functions[i].getWindowFrame().getEndBound();
         switch (endBound.getBoundType()) {
@@ -161,11 +161,13 @@ public class WindowAggExec extends UnaryPhysicalExec {
       }
 
       sortKeyColumns = new int[additionalSortKeyColumns.size()];
-      schemaForOrderBy = SchemaFactory.newV1(outSchema);
+      SchemaBuilder schemaForOrderByBld = SchemaBuilder.builder();
+      schemaForOrderByBld.addAll(outSchema.getRootColumns());
       for (int i = 0; i < additionalSortKeyColumns.size(); i++) {
         sortKeyColumns[i] = i;
-        schemaForOrderBy.addColumn(additionalSortKeyColumns.get(i));
+        schemaForOrderByBld.add(additionalSortKeyColumns.get(i));
       }
+      schemaForOrderBy = schemaForOrderByBld.build();
     } else {
       functions = new WindowFunctionEval[0];
       functionNum = 0;

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 47d4b4f..c16e95b 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.SchemaBuilder;
 import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.exception.TajoException;
 import org.apache.tajo.plan.LogicalPlan;
@@ -155,11 +156,7 @@ public class ExplainPlanPreprocessorForTest {
       Column[] columns = schema.toArray();
       Arrays.sort(columns, columnComparator);
 
-      Schema sorted = SchemaFactory.newV1();
-      for (Column col : columns) {
-        sorted.addColumn(col);
-      }
-      return sorted;
+      return SchemaBuilder.builder().addAll(columns).build();
     }
 
     private EvalNode sortQual(EvalNode qual) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 da11bd8..1a51d98 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,8 +218,8 @@ public class QueryExecutor {
       explainStr = PlannerUtil.buildExplainString(plan.getRootBlock().getRoot());
     }
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("explain", TajoDataTypes.Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("explain", TajoDataTypes.Type.TEXT).build();
 
     SerializedResultSet.Builder serializedResBuilder = SerializedResultSet.newBuilder();
     MemoryRowBlock rowBlock = new MemoryRowBlock(SchemaUtil.toDataTypes(schema));

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 8fdd6ce..2a688e5 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 = SchemaFactory.newV1(channel.getShuffleKeys());
+    Schema sortSchema = SchemaBuilder.builder().addAll(channel.getShuffleKeys()).build();
 
     TupleRange[] ranges;
     int determinedTaskNum;

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 f4bf2b0..e3cf73a 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,21 +605,22 @@ public class TajoDatabaseMetaData implements DatabaseMetaData {
         , new ArrayList<MetaDataTuple>());
   }
 
-  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
-      .addColumn("PKCOLUMN_NAME", Type.VARCHAR) // 3
-      .addColumn("FKTABLE_CAT", Type.VARCHAR)   // 4
-      .addColumn("FKTABLE_SCHEM", Type.VARCHAR) // 5
-      .addColumn("FKTABLE_NAME", Type.VARCHAR)  // 6
-      .addColumn("FKCOLUMN_NAME", Type.VARCHAR) // 7
-      .addColumn("KEY_SEQ", Type.INT2)          // 8
-      .addColumn("UPDATE_RULE", Type.INT2)      // 9
-      .addColumn("DELETE_RULE", Type.INT2)      // 10
-      .addColumn("FK_NAME", Type.VARCHAR)       // 11
-      .addColumn("PK_NAME", Type.VARCHAR)       // 12
-      .addColumn("DEFERRABILITY", Type.INT2);   // 13
+  private final static Schema importedExportedSchema = SchemaBuilder.builder()
+      .add("PKTABLE_CAT", Type.VARCHAR)   // 0
+      .add("PKTABLE_SCHEM", Type.VARCHAR) // 1
+      .add("PKTABLE_NAME", Type.VARCHAR)  // 2
+      .add("PKCOLUMN_NAME", Type.VARCHAR) // 3
+      .add("FKTABLE_CAT", Type.VARCHAR)   // 4
+      .add("FKTABLE_SCHEM", Type.VARCHAR) // 5
+      .add("FKTABLE_NAME", Type.VARCHAR)  // 6
+      .add("FKCOLUMN_NAME", Type.VARCHAR) // 7
+      .add("KEY_SEQ", Type.INT2)          // 8
+      .add("UPDATE_RULE", Type.INT2)      // 9
+      .add("DELETE_RULE", Type.INT2)      // 10
+      .add("FK_NAME", Type.VARCHAR)       // 11
+      .add("PK_NAME", Type.VARCHAR)       // 12
+      .add("DEFERRABILITY", Type.INT2)    // 13
+      .build();
 
   @Override
   public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException {

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 0fbb9aa..0e9b2a7 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
@@ -25,12 +25,12 @@ import com.google.protobuf.ByteString;
 import org.apache.hadoop.fs.Path;
 import org.apache.tajo.IntegrationTest;
 import org.apache.tajo.TajoConstants;
+import org.apache.tajo.TajoProtos.CodecType;
 import org.apache.tajo.TajoTestingCluster;
 import org.apache.tajo.TpchTestBase;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.client.TajoClient;
-import org.apache.tajo.TajoProtos.CodecType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.DatumFactory;
@@ -69,9 +69,10 @@ public class TestResultSet {
     conf = util.getConfiguration();
     sm = TablespaceManager.getDefault();
 
-    scoreSchema = SchemaFactory.newV1();
-    scoreSchema.addColumn("deptname", Type.TEXT);
-    scoreSchema.addColumn("score", Type.INT4);
+    scoreSchema = SchemaBuilder.builder()
+        .add("deptname", Type.TEXT)
+        .add("score", Type.INT4)
+        .build();
     scoreMeta = CatalogUtil.newTableMeta("TEXT");
     rowBlock = new MemoryRowBlock(SchemaUtil.toDataTypes(scoreSchema));
     TableStats stats = new TableStats();
@@ -197,10 +198,11 @@ public class TestResultSet {
       String query = "select col1, col2, col3 from " + tableName;
 
       String [] table = new String[] {tableName};
-      Schema schema = SchemaFactory.newV1();
-      schema.addColumn("col1", Type.DATE);
-      schema.addColumn("col2", Type.TIME);
-      schema.addColumn("col3", Type.TIMESTAMP);
+      Schema schema = SchemaBuilder.builder()
+          .add("col1", Type.DATE)
+          .add("col2", Type.TIME)
+          .add("col3", Type.TIMESTAMP)
+          .build();
       Schema [] schemas = new Schema[] {schema};
       String [] data = {
           "2014-01-01|01:00:00|2014-01-01 01:00:00"

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbcNegative.java
----------------------------------------------------------------------
diff --git a/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbcNegative.java b/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbcNegative.java
index 56755a5..07207dd 100644
--- a/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbcNegative.java
+++ b/tajo-jdbc/src/test/java/org/apache/tajo/jdbc/TestTajoJdbcNegative.java
@@ -169,7 +169,7 @@ public class TestTajoJdbcNegative extends QueryTestCaseBase {
 
     try (Statement stmt = conn.createStatement()) {
       stmt.executeUpdate("CREATE DATABASE IF NOT EXISTS TestTajoJdbcNegative");
-      stmt.executeUpdate("CREATE TABLE TestTajoJdbcNegative.table123u8sd ( name RECORD(last TEXT, first TEXT) )");
+      stmt.executeUpdate("CREATE TABLE TestTajoJdbcNegative.table123u8sd ( name RECORD (last TEXT, first TEXT) )");
 
       try (ResultSet resultSet = stmt.executeQuery("select name FROM TestTajoJdbcNegative.table123u8sd")) {
         fail("Getting a record type field must be failed");

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 f791a3d..9176c2f 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
@@ -19,6 +19,7 @@
 package org.apache.tajo.plan;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -32,13 +33,13 @@ import org.apache.tajo.SessionVars;
 import org.apache.tajo.algebra.*;
 import org.apache.tajo.algebra.WindowSpec;
 import org.apache.tajo.catalog.*;
-import org.apache.tajo.exception.*;
 import org.apache.tajo.catalog.partition.PartitionMethodDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.catalog.proto.CatalogProtos.IndexMethod;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.NullDatum;
+import org.apache.tajo.exception.*;
 import org.apache.tajo.plan.LogicalPlan.QueryBlock;
 import org.apache.tajo.plan.algebra.BaseAlgebraVisitor;
 import org.apache.tajo.plan.expr.*;
@@ -52,6 +53,7 @@ import org.apache.tajo.util.KeyValueSet;
 import org.apache.tajo.util.Pair;
 import org.apache.tajo.util.StringUtils;
 
+import javax.annotation.Nullable;
 import java.net.URI;
 import java.util.*;
 
@@ -1228,21 +1230,10 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
   }
 
   private static Schema getNaturalJoinSchema(LogicalNode left, LogicalNode right) {
-    Schema joinSchema = SchemaFactory.newV1();
-    Schema commons = SchemaUtil.getNaturalJoinColumns(left.getOutSchema(), right.getOutSchema());
-    joinSchema.addColumns(commons);
-    for (Column c : left.getOutSchema().getRootColumns()) {
-      if (!joinSchema.contains(c.getQualifiedName())) {
-        joinSchema.addColumn(c);
-      }
-    }
-
-    for (Column c : right.getOutSchema().getRootColumns()) {
-      if (!joinSchema.contains(c.getQualifiedName())) {
-        joinSchema.addColumn(c);
-      }
-    }
-    return joinSchema;
+    SchemaBuilder joinSchema = SchemaBuilder.uniqueNameBuilder();
+    joinSchema.addAll(left.getOutSchema().getRootColumns());
+    joinSchema.addAll(right.getOutSchema().getRootColumns());
+    return joinSchema.build();
   }
 
   private static EvalNode getNaturalJoinCondition(JoinNode joinNode) {
@@ -1677,7 +1668,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 = SchemaFactory.newV1();
+      final SchemaBuilder targetColumnsBld = SchemaBuilder.builder();
       for (ColumnReferenceExpr target : targets) {
         Column targetColumn = desc.getLogicalSchema().getColumn(target.getCanonicalName().replace(".", "/"));
 
@@ -1685,8 +1676,9 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
           throw makeSyntaxError("column '" + target + "' of relation '" + desc.getName() + "' does not exist");
         }
 
-        targetColumns.addColumn(targetColumn);
+        targetColumnsBld.add(targetColumn);
       }
+      final Schema targetColumns = targetColumnsBld.build();
       insertNode.setTargetSchema(targetColumns);
       insertNode.setOutSchema(targetColumns);
       buildProjectedInsert(context, insertNode);
@@ -1697,11 +1689,11 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
       Schema tableSchema = desc.getLogicalSchema();
       Schema projectedSchema = insertNode.getChild().getOutSchema();
 
-      Schema targetColumns = SchemaFactory.newV1();
+      SchemaBuilder targetColumns = SchemaBuilder.builder();
       for (int i = 0; i < projectedSchema.size(); i++) {
-        targetColumns.addColumn(tableSchema.getColumn(i));
+        targetColumns.add(tableSchema.getColumn(i));
       }
-      insertNode.setTargetSchema(targetColumns);
+      insertNode.setTargetSchema(targetColumns.build());
       buildProjectedInsert(context, insertNode);
     }
 
@@ -1956,15 +1948,16 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
               queryOutputSchema.size() < partitionExpressionSchema.size()) {
             throw makeSyntaxError("Partition columns cannot be more than table columns.");
           }
-          Schema tableSchema = SchemaFactory.newV1();
+          SchemaBuilder tableSchemaBld = SchemaBuilder.builder();
           for (int i = 0; i < queryOutputSchema.size() - partitionExpressionSchema.size(); i++) {
-            tableSchema.addColumn(queryOutputSchema.getColumn(i));
+            tableSchemaBld.add(queryOutputSchema.getColumn(i));
           }
+          Schema tableSchema = tableSchemaBld.build();
           createTableNode.setOutSchema(tableSchema);
           createTableNode.setTableSchema(tableSchema);
         } else {
           // Convert the schema of subquery into the target table's one.
-          Schema schema = SchemaFactory.newV1(subQuery.getOutSchema());
+          Schema schema = SchemaBuilder.builder().addAll(subQuery.getOutSchema().getRootColumns()).build();
           schema.setQualifier(createTableNode.getTableName());
           createTableNode.setOutSchema(schema);
           createTableNode.setTableSchema(schema);
@@ -2040,13 +2033,12 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
    * @return schema transformed from table definition elements
    */
   private Schema convertColumnsToSchema(ColumnDefinition[] elements) {
-    Schema schema = SchemaFactory.newV1();
-
-    for (ColumnDefinition columnDefinition: elements) {
-      schema.addColumn(convertColumn(columnDefinition));
-    }
-
-    return schema;
+    return SchemaBuilder.builder().addAll(elements, new Function<ColumnDefinition, Column>() {
+      @Override
+      public Column apply(@Nullable ColumnDefinition input) {
+        return convertColumn(input);
+      }
+    }).build();
   }
 
   /**
@@ -2056,13 +2048,12 @@ public class LogicalPlanner extends BaseAlgebraVisitor<LogicalPlanner.PlanContex
    * @return schema transformed from table definition elements
    */
   private static Schema convertTableElementsSchema(ColumnDefinition[] elements) {
-    Schema schema = SchemaFactory.newV1();
-
-    for (ColumnDefinition columnDefinition: elements) {
-      schema.addColumn(convertColumn(columnDefinition));
-    }
-
-    return schema;
+    return SchemaBuilder.builder().addAll(elements, new Function<ColumnDefinition, Column>() {
+      @Override
+      public Column apply(@Nullable ColumnDefinition input) {
+        return convertColumn(input);
+      }
+    }).build();
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 31cd1c6..c71dba2 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
@@ -18,16 +18,14 @@
 
 package org.apache.tajo.plan.expr;
 
+import com.google.common.base.Function;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import org.apache.tajo.algebra.ColumnReferenceExpr;
 import org.apache.tajo.algebra.NamedExpr;
 import org.apache.tajo.algebra.OpType;
 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.catalog.*;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.exception.TajoInternalError;
@@ -143,16 +141,15 @@ public class EvalTreeUtil {
     node.postOrder(finder);
     return finder.getColumnRefs();
   }
-  
+
   public static Schema getSchemaByTargets(Schema inputSchema, List<Target> targets) {
-    Schema schema = SchemaFactory.newV1();
-    for (Target target : targets) {
-      schema.addColumn(
-          target.hasAlias() ? target.getAlias() : target.getEvalTree().getName(),
-          getDomainByExpr(inputSchema, target.getEvalTree()));
-    }
-    
-    return schema;
+    return SchemaBuilder.builder().addAll(targets, new Function<Target, Column>() {
+      @Override
+      public Column apply(@javax.annotation.Nullable Target target) {
+        return new Column(target.hasAlias() ? target.getAlias() : target.getEvalTree().getName(),
+            getDomainByExpr(inputSchema, target.getEvalTree()));
+      }
+    }).build();
   }
 
   public static String columnsToStr(Collection<Column> columns) {

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

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 3fed563..bb24b22 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
@@ -22,6 +22,7 @@ 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.catalog.SchemaUtil;
 import org.apache.tajo.plan.PlanString;
 import org.apache.tajo.util.TUtil;
 
@@ -42,8 +43,8 @@ public class CreateTableNode extends StoreTableNode implements Cloneable {
 
   public Schema getLogicalSchema() {
     if (hasPartition()) {
-      Schema logicalSchema = SchemaFactory.newV1(tableSchema);
-      logicalSchema.addColumns(getPartitionMethod().getExpressionSchema());
+      Schema logicalSchema = SchemaUtil.merge(tableSchema, getPartitionMethod().getExpressionSchema());
+      logicalSchema.setQualifier(tableName);
       return logicalSchema;
     } else {
       return tableSchema;

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 a993d64..de99800 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
@@ -19,9 +19,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;
@@ -124,9 +122,9 @@ public class InsertNode extends StoreTableNode implements Cloneable {
   public Object clone() throws CloneNotSupportedException {
     InsertNode insertNode = (InsertNode) super.clone();
     insertNode.overwrite = overwrite;
-    insertNode.tableSchema = SchemaFactory.newV1(tableSchema);
-    insertNode.targetSchema = targetSchema != null ? SchemaFactory.newV1(targetSchema) : null;
-    insertNode.projectedSchema = projectedSchema != null ? SchemaFactory.newV1(projectedSchema) : null;
+    insertNode.tableSchema = (Schema) tableSchema.clone();
+    insertNode.targetSchema = targetSchema != null ? (Schema) targetSchema.clone() : null;
+    insertNode.projectedSchema = projectedSchema != null ? (Schema) projectedSchema.clone() : null;
     insertNode.uri = uri != null ? uri : null;
     return insertNode;
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 5427ba6..0729d6e 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
@@ -81,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(SchemaFactory.newV1(getInSchema()));
+    this.setOutSchema(SchemaBuilder.builder().addAll(getInSchema().getRootColumns()).build());
     logicalSchema = SchemaUtil.getQualifiedLogicalSchema(tableDesc, qualifiedAlias);
 	}
 	

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 c5ca1ef..60187d9 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
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.plan.rewrite;
 
+import com.google.common.base.Function;
 import com.google.common.base.Objects;
 import org.apache.tajo.SessionVars;
 import org.apache.tajo.algebra.*;
@@ -43,6 +44,7 @@ import org.apache.tajo.util.TUtil;
 import org.apache.tajo.util.graph.DirectedGraphVisitor;
 import org.apache.tajo.util.graph.SimpleDirectedGraph;
 
+import javax.annotation.Nullable;
 import java.util.*;
 
 /**
@@ -401,7 +403,6 @@ public class SelfDescSchemaBuildPhase extends LogicalPlanPreprocessPhase {
     private Schema buildSchemaFromColumnSet(Set<Column> columns) throws TajoException {
       SchemaGraph schemaGraph = new SchemaGraph();
       Set<ColumnVertex> rootVertexes = new HashSet<>();
-      Schema schema = SchemaFactory.newV1();
 
       Set<Column> simpleColumns = new HashSet<>();
       List<Column> columnList = new ArrayList<>(columns);
@@ -446,21 +447,20 @@ public class SelfDescSchemaBuildPhase extends LogicalPlanPreprocessPhase {
         }
       }
 
+      SchemaBuilder schema = SchemaBuilder.uniqueNameBuilder();
       // Build record columns
       RecordColumnBuilder builder = new RecordColumnBuilder(schemaGraph);
       for (ColumnVertex eachRoot : rootVertexes) {
         schemaGraph.accept(null, eachRoot, builder);
-        schema.addColumn(eachRoot.column);
+        schema.add(eachRoot.column);
       }
 
       // Add simple columns
       for (Column eachColumn : simpleColumns) {
-        if (!schema.contains(eachColumn)) {
-          schema.addColumn(eachColumn);
-        }
+        schema.add(eachColumn);
       }
 
-      return schema;
+      return schema.build();
     }
 
     private static class ColumnVertex {
@@ -523,11 +523,15 @@ public class SelfDescSchemaBuildPhase extends LogicalPlanPreprocessPhase {
         if (graph.isLeaf(schemaVertex)) {
           schemaVertex.column = new Column(schemaVertex.name, schemaVertex.type);
         } else {
-          Schema schema = SchemaFactory.newV1();
-          for (ColumnVertex eachChild : graph.getChilds(schemaVertex)) {
-            schema.addColumn(eachChild.column);
-          }
-          schemaVertex.column = new Column(schemaVertex.name, new TypeDesc(schema));
+          SchemaBuilder schema = SchemaBuilder.builder()
+              .addAll(graph.getChilds(schemaVertex), new Function<ColumnVertex, Column>() {
+                @Override
+                public Column apply(@Nullable ColumnVertex input) {
+                  return input.column;
+                }
+              });
+
+          schemaVertex.column = new Column(schemaVertex.name, new TypeDesc(schema.build()));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 26c27b3..2c197c2 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
@@ -18,11 +18,9 @@
 
 package org.apache.tajo.plan.rewrite.rules;
 
+import com.google.common.base.Function;
 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.*;
 import org.apache.tajo.catalog.statistics.TableStats;
 import org.apache.tajo.common.ProtoObject;
 import org.apache.tajo.datum.Datum;
@@ -30,6 +28,7 @@ import org.apache.tajo.plan.serder.EvalNodeDeserializer;
 import org.apache.tajo.plan.serder.EvalNodeSerializer;
 import org.apache.tajo.plan.serder.PlanProto.SimplePredicateProto;
 
+import javax.annotation.Nullable;
 import java.net.URI;
 
 public class IndexScanInfo extends AccessPathInfo {
@@ -93,11 +92,13 @@ public class IndexScanInfo extends AccessPathInfo {
   public IndexScanInfo(TableStats tableStats, IndexDesc indexDesc, SimplePredicate[] predicates) {
     super(ScanTypeControl.INDEX_SCAN, tableStats);
     this.indexPath = indexDesc.getIndexPath();
-    keySchema = SchemaFactory.newV1();
     this.predicates = predicates;
-    for (SimplePredicate predicate : predicates) {
-      keySchema.addColumn(predicate.getKeySortSpec().getSortKey());
-    }
+    keySchema = SchemaBuilder.builder().addAll(predicates, new Function<SimplePredicate, Column>() {
+      @Override
+      public Column apply(@Nullable SimplePredicate p) {
+        return p.getKeySortSpec().getSortKey();
+      }
+    }).build();
   }
 
   public URI getIndexPath() {

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 00580ae..cf92ea0 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,10 +334,9 @@ public class PartitionedTableRewriter implements LogicalPlanRewriteRule {
     TableDesc table = scanNode.getTableDesc();
     PartitionMethodDesc partitionDesc = scanNode.getTableDesc().getPartitionMethod();
 
-    Schema paritionValuesSchema = SchemaFactory.newV1();
-    for (Column column : partitionDesc.getExpressionSchema().getRootColumns()) {
-      paritionValuesSchema.addColumn(column);
-    }
+    Schema paritionValuesSchema = SchemaBuilder.builder()
+        .addAll(partitionDesc.getExpressionSchema().getRootColumns())
+        .build();
 
     Set<EvalNode> indexablePredicateSet = Sets.newHashSet();
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 eccd37a..ff3e3c8 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
@@ -18,16 +18,16 @@
 
 package org.apache.tajo.plan.util;
 
+import com.google.common.base.Function;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.tajo.algebra.*;
 import org.apache.tajo.annotation.Nullable;
 import org.apache.tajo.catalog.*;
+import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.DataType;
-import org.apache.tajo.exception.TajoException;
-import org.apache.tajo.exception.TajoInternalError;
-import org.apache.tajo.exception.UndefinedTableException;
+import org.apache.tajo.exception.*;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.Target;
 import org.apache.tajo.plan.expr.*;
@@ -565,12 +565,12 @@ public class PlannerUtil {
   }
 
   public static Schema sortSpecsToSchema(SortSpec[] sortSpecs) {
-    Schema schema = SchemaFactory.newV1();
-    for (SortSpec spec : sortSpecs) {
-      schema.addColumn(spec.getSortKey());
-    }
-
-    return schema;
+    return SchemaBuilder.builder().addAll(sortSpecs, new Function<SortSpec, Column>() {
+      @Override
+      public Column apply(@javax.annotation.Nullable SortSpec s) {
+        return s.getSortKey();
+      }
+    }).build();
   }
 
   public static SortSpec[][] getSortKeysFromJoinQual(EvalNode joinQual, Schema outer, Schema inner) {
@@ -656,21 +656,26 @@ public class PlannerUtil {
   }
 
   public static Schema targetToSchema(List<Target> targets) {
-    Schema schema = SchemaFactory.newV1();
+    SchemaBuilder schema = SchemaBuilder.uniqueNameBuilder();
     for (Target t : targets) {
       DataType type = t.getEvalTree().getValueType();
+
+      // hack to avoid projecting record type.
+      if (type.getType() == TajoDataTypes.Type.RECORD) {
+        throw new TajoRuntimeException(new NotImplementedException("record projection"));
+      }
+
       String name;
       if (t.hasAlias()) {
         name = t.getAlias();
       } else {
         name = t.getEvalTree().getName();
       }
-      if (!schema.containsByQualifiedName(name)) {
-        schema.addColumn(name, type);
-      }
+
+      schema.add(name, type);
     }
 
-    return schema;
+    return schema.build();
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 f3acb00..3e44e3b 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,7 +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.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.plan.logical.GroupbyNode;
 import org.apache.tajo.plan.logical.JoinNode;
@@ -36,10 +36,11 @@ public class TestLogicalNode {
 
   @Test
   public void testEquals() {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("id", Type.INT4);
-    schema.addColumn("name", Type.TEXT);
-    schema.addColumn("age", Type.INT2);
+    Schema schema = SchemaBuilder.builder()
+        .add("id", Type.INT4)
+        .add("name", Type.TEXT)
+        .add("age", Type.INT2)
+        .build();
     GroupbyNode groupbyNode = new GroupbyNode(0);
     groupbyNode.setGroupingColumns(new Column[]{schema.getColumn(1), schema.getColumn(2)});
     ScanNode scanNode = new ScanNode(0);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 ec20aca..1fa6214 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.catalog.statistics.ColumnStats;
 import org.apache.tajo.catalog.statistics.TableStats;
@@ -166,7 +166,7 @@ public class MergeScanner implements Scanner {
 
   @Override
   public void setTarget(Column[] targets) {
-    this.target = SchemaFactory.newV1(targets);
+    this.target = SchemaBuilder.builder().addAll(targets).build();
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 560e642..be30fe0 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
@@ -18,10 +18,11 @@
 
 package org.apache.tajo.storage;
 
+import com.google.common.base.Function;
 import com.google.common.base.Objects;
-import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.SchemaFactory;
-import org.apache.tajo.catalog.SortSpec;
+import org.apache.tajo.catalog.*;
+
+import javax.annotation.Nullable;
 
 /**
  * It represents a pair of start and end tuples.
@@ -39,12 +40,12 @@ public class TupleRange implements Comparable<TupleRange>, Cloneable {
   }
 
   public static Schema sortSpecsToSchema(SortSpec[] sortSpecs) {
-    Schema schema = SchemaFactory.newV1();
-    for (SortSpec spec : sortSpecs) {
-      schema.addColumn(spec.getSortKey());
-    }
-
-    return schema;
+    return SchemaBuilder.builder().addAll(sortSpecs, new Function<SortSpec, Column>() {
+      @Override
+      public Column apply(@Nullable SortSpec input) {
+        return input.getSortKey();
+      }
+    }).build();
   }
 
   public void setStart(Tuple tuple) {


[5/6] tajo git commit: TAJO-2108: Refactor Schema to be immutable.

Posted by hy...@apache.org.
http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 f3933ff..6af2798 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,24 +334,20 @@ public class TestCatalogAgainstCaseSensitivity {
     String databaseName = "TestDatabase1";
     String tableName = "nested_Table";
 
-    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 = 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(
-        SchemaFactory.newV1(new Column[]{
-            new Column("CoL1", CatalogUtil.newSimpleDataType(Type.INT4)),
-            new Column("RecoRd1", new TypeDesc(schema)),
-        })
-    ));
+    Schema schema = SchemaBuilder.builder()
+        .add("CoL1", CatalogUtil.newSimpleDataType(Type.INT4))
+        .add("CoL2", CatalogUtil.newSimpleDataType(Type.FLOAT4))
+        .add("CoL3", CatalogUtil.newSimpleDataType(Type.TEXT)).build();
+
+    Schema tableSchema = SchemaBuilder.builder()
+    .add("RecoRd1", new TypeDesc(schema))
+    .add("CoL1", CatalogUtil.newSimpleDataType(Type.INT4))
+    .add("CoL3", CatalogUtil.newSimpleDataType(Type.TEXT))
+    .add("RecoRd2", new TypeDesc(schema))
+    .add("RecoRd3", new TypeDesc(
+        SchemaBuilder.builder()
+            .add("CoL1", CatalogUtil.newSimpleDataType(Type.INT4))
+            .add("RecoRd1", new TypeDesc(schema)).build())).build();
 
     TableDesc tableDesc = new TableDesc(
         CatalogUtil.buildFQName(databaseName, tableName),

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 c151e3b..8ba3d59 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,10 +115,11 @@ public class TestCatalogExceptions {
   public void testCreateTableWithWrongUri() throws Exception {
     // TODO: currently, wrong uri does not occur any exception.
     String tableName = "wrongUri";
-    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);
+    Schema schema = SchemaBuilder.builder()
+        .add(CatalogUtil.buildFQName(tableName, "Column"), Type.BLOB)
+        .add(CatalogUtil.buildFQName(tableName, "column"), Type.INT4)
+        .add(CatalogUtil.buildFQName(tableName, "cOlumn"), Type.INT8)
+        .build();
     Path path = new Path(CommonTestingUtil.getTestDir(), tableName);
     catalog.createTable(
       new TableDesc(

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 d381ebd..dece380 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",
-      SchemaFactory.newV1(new Column[]{new Column("c1", Type.INT8)}),
+      SchemaBuilder.builder().addAll(new Column[]{new Column("c1", Type.INT8)}).build(),
       "TEXT", new KeyValueSet(), URI.create("http://space1/x/table1")
   );
 
   static TableDesc TABLE2 = new TableDesc(
       "table2",
-          SchemaFactory.newV1(new Column[]{new Column("c1", Type.INT8)}),
+          SchemaBuilder.builder().addAll(new Column[]{new Column("c1", Type.INT8)}).build(),
       "TEXT", new KeyValueSet(), URI.create("http://space1/x/table2")
   );
 
   static TableDesc TABLE3 = new TableDesc(
       "table3",
-      SchemaFactory.newV1(new Column[]{new Column("c1", Type.INT8)}),
+      SchemaBuilder.builder().addAll(new Column[]{new Column("c1", Type.INT8)}).build(),
       "TEXT", new KeyValueSet(), URI.create("http://space1/x/table3")
   );
 
   static TableDesc TABLE4 = new TableDesc(
       "table4",
-          SchemaFactory.newV1(new Column[]{new Column("c1", Type.INT8)}),
+          SchemaBuilder.builder().addAll(new Column[]{new Column("c1", Type.INT8)}).build(),
       "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",
-        SchemaFactory.newV1(),
+        SchemaBuilder.empty(),
         new TableMeta("x", new KeyValueSet()),
         URI.create("file:///"));
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 733bcec..2fe67ed 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
@@ -23,7 +23,7 @@ import org.apache.tajo.QueryIdFactory;
 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.SchemaBuilder;
 import org.apache.tajo.catalog.SchemaFactory;
 import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.exception.QueryNotFoundException;
@@ -107,9 +107,9 @@ public class TajoClientUtil {
   }
 
   public static final ResultSet NULL_RESULT_SET =
-      new TajoMemoryResultSet(QueryIdFactory.NULL_QUERY_ID, SchemaFactory.newV1(), null, null);
+      new TajoMemoryResultSet(QueryIdFactory.NULL_QUERY_ID, SchemaBuilder.empty(), null, null);
 
   public static TajoMemoryResultSet createNullResultSet(QueryId queryId) {
-    return new TajoMemoryResultSet(queryId, SchemaFactory.newV1(), null, null);
+    return new TajoMemoryResultSet(queryId, SchemaBuilder.empty(), null, null);
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 6e7092b..d73a713 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,7 +19,7 @@
 package org.apache.tajo.jdbc;
 
 import org.apache.tajo.catalog.Schema;
-import org.apache.tajo.catalog.SchemaFactory;
+import org.apache.tajo.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.storage.Tuple;
 
@@ -36,13 +36,16 @@ public class TajoMetaDataResultSet extends TajoResultSetBase {
   }
 
   public TajoMetaDataResultSet(List<String> columns, List<Type> types, List<MetaDataTuple> values) {
-    super(null, SchemaFactory.newV1(), null);
+    super(null, SchemaBuilder.empty(), null);
+
+    SchemaBuilder builder = SchemaBuilder.builder();
     int index = 0;
     if(columns != null) {
       for(String columnName: columns) {
-        schema.addColumn(columnName, types.get(index++));
+        builder.add(columnName, types.get(index++));
       }
     }
+    this.schema = builder.build();
     setDataTuples(values);
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 062db47..28605d3 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,7 +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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
@@ -36,9 +36,10 @@ public class BackendTestingUtil {
   public final static TableMeta mockupMeta;
 
   static {
-    mockupSchema = SchemaFactory.newV1();
-    mockupSchema.addColumn("deptname", Type.TEXT);
-    mockupSchema.addColumn("score", Type.INT4);
+    mockupSchema = SchemaBuilder.builder()
+        .add("deptname", Type.TEXT)
+        .add("score", Type.INT4)
+        .build();
     mockupMeta = CatalogUtil.newTableMeta("TEXT");
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-common/src/main/java/org/apache/tajo/schema/Identifier.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/schema/Identifier.java b/tajo-common/src/main/java/org/apache/tajo/schema/Identifier.java
index 99fe6ba..d71dbdc 100644
--- a/tajo-common/src/main/java/org/apache/tajo/schema/Identifier.java
+++ b/tajo-common/src/main/java/org/apache/tajo/schema/Identifier.java
@@ -55,6 +55,22 @@ public class Identifier {
     return sb.toString();
   }
 
+  /**
+   * Raw string of an identifier
+   * @param policy Identifier Policy
+   * @return raw string
+   */
+  public String raw(IdentifierPolicy policy) {
+    StringBuilder sb = new StringBuilder();
+    if (quoted) {
+      appendByCase(sb, policy.storesQuotedIdentifierAs());
+    } else {
+      appendByCase(sb, policy.storesUnquotedIdentifierAs());
+    }
+
+    return sb.toString();
+  }
+
   private void appendByCase(StringBuilder sb, IdentifierCase c) {
     switch (c) {
     case LowerCase:

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-common/src/main/java/org/apache/tajo/schema/QualifiedIdentifier.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/schema/QualifiedIdentifier.java b/tajo-common/src/main/java/org/apache/tajo/schema/QualifiedIdentifier.java
index b252d82..57317b5 100644
--- a/tajo-common/src/main/java/org/apache/tajo/schema/QualifiedIdentifier.java
+++ b/tajo-common/src/main/java/org/apache/tajo/schema/QualifiedIdentifier.java
@@ -20,6 +20,7 @@ package org.apache.tajo.schema;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
 import org.apache.tajo.util.StringUtils;
 
@@ -44,6 +45,20 @@ public class QualifiedIdentifier {
     });
   }
 
+  /**
+   * Raw string of qualified identifier
+   * @param policy Identifier Policy
+   * @return raw string
+   */
+  public String raw(final IdentifierPolicy policy) {
+    return StringUtils.join(names, policy.getIdentifierSeperator(), new Function<Identifier, String>() {
+      @Override
+      public String apply(@Nullable Identifier identifier) {
+        return identifier.raw(policy);
+      }
+    });
+  }
+
   @Override
   public String toString() {
     return displayString(DefaultPolicy());

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-common/src/main/java/org/apache/tajo/schema/Schema.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/schema/Schema.java b/tajo-common/src/main/java/org/apache/tajo/schema/Schema.java
index b939f30..dfd0b72 100644
--- a/tajo-common/src/main/java/org/apache/tajo/schema/Schema.java
+++ b/tajo-common/src/main/java/org/apache/tajo/schema/Schema.java
@@ -25,13 +25,15 @@ import org.apache.tajo.util.StringUtils;
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Iterator;
+import java.util.Objects;
 
 import static org.apache.tajo.common.TajoDataTypes.Type.RECORD;
 
 /**
  * A field is a pair of a name and a type. Schema is an ordered list of fields.
  */
-public class Schema {
+public class Schema implements Iterable<Schema.NamedType> {
   private final ImmutableList<NamedType> namedTypes;
 
   public Schema(Collection<NamedType> namedTypes) {
@@ -63,6 +65,11 @@ public class Schema {
     return new NamedPrimitiveType(name, type);
   }
 
+  @Override
+  public Iterator<NamedType> iterator() {
+    return namedTypes.iterator();
+  }
+
   public static abstract class NamedType {
     protected final QualifiedIdentifier name;
 
@@ -73,34 +80,100 @@ public class Schema {
     public QualifiedIdentifier name() {
       return this.name;
     }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(name);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+
+      if (this == obj) {
+        return true;
+      }
+
+      if (obj instanceof NamedType) {
+        NamedType other = (NamedType) obj;
+        return this.name.equals(other.name);
+      }
+
+      return false;
+    }
   }
 
   public static class NamedPrimitiveType extends NamedType {
     private final Type type;
 
-    NamedPrimitiveType(QualifiedIdentifier name, Type type) {
+    public NamedPrimitiveType(QualifiedIdentifier name, Type type) {
       super(name);
       Preconditions.checkArgument(type.baseType() != RECORD);
       this.type = type;
     }
 
+    public Type type() {
+      return type;
+    }
+
     @Override
     public String toString() {
       return name + " " + type;
     }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(name, type);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (obj == this) {
+        return true;
+      }
+
+      if (obj instanceof NamedPrimitiveType) {
+        NamedPrimitiveType other = (NamedPrimitiveType) obj;
+        return super.equals(other) && this.type.equals(type);
+      }
+
+      return false;
+    }
   }
 
   public static class NamedStructType extends NamedType {
-    private final ImmutableList<NamedType> namedTypes;
+    private final ImmutableList<NamedType> fields;
 
-    public NamedStructType(QualifiedIdentifier name, Collection<NamedType> namedTypes) {
+    public NamedStructType(QualifiedIdentifier name, Collection<NamedType> fields) {
       super(name);
-      this.namedTypes = ImmutableList.copyOf(namedTypes);
+      this.fields = ImmutableList.copyOf(fields);
+    }
+
+    public Collection<NamedType> fields() {
+      return this.fields;
     }
 
     @Override
     public String toString() {
-      return name + " record (" + StringUtils.join(namedTypes, ",") + ")";
+      return name + " record (" + StringUtils.join(fields, ",") + ")";
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(name, fields);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (obj == this) {
+        return true;
+      }
+
+      if (obj instanceof NamedStructType) {
+        NamedStructType other = (NamedStructType) obj;
+        return super.equals(other) && fields.equals(other.fields);
+      }
+
+      return false;
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-common/src/main/java/org/apache/tajo/type/Any.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Any.java b/tajo-common/src/main/java/org/apache/tajo/type/Any.java
new file mode 100644
index 0000000..d61afae
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Any.java
@@ -0,0 +1,33 @@
+/**
+ * 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+import java.util.Objects;
+
+public class Any extends Type {
+
+  public static Any INSTANCE = new Any();
+
+  @Override
+  public TajoDataTypes.Type baseType() {
+    return TajoDataTypes.Type.ANY;
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-common/src/main/java/org/apache/tajo/type/Array.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Array.java b/tajo-common/src/main/java/org/apache/tajo/type/Array.java
index cd02d1e..9a595fd 100644
--- a/tajo-common/src/main/java/org/apache/tajo/type/Array.java
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Array.java
@@ -34,6 +34,11 @@ public class Array extends Type {
   }
 
   @Override
+  public boolean hasParam() {
+    return true;
+  }
+
+  @Override
   public TajoDataTypes.Type baseType() {
     return TajoDataTypes.Type.ARRAY;
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-common/src/main/java/org/apache/tajo/type/Char.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Char.java b/tajo-common/src/main/java/org/apache/tajo/type/Char.java
index 04857ec..348e041 100644
--- a/tajo-common/src/main/java/org/apache/tajo/type/Char.java
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Char.java
@@ -34,6 +34,11 @@ public class Char extends Type {
   }
 
   @Override
+  public boolean hasParam() {
+    return true;
+  }
+
+  @Override
   public TajoDataTypes.Type baseType() {
     return TajoDataTypes.Type.CHAR;
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-common/src/main/java/org/apache/tajo/type/Inet4.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Inet4.java b/tajo-common/src/main/java/org/apache/tajo/type/Inet4.java
new file mode 100644
index 0000000..05dc0cf
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Inet4.java
@@ -0,0 +1,28 @@
+/**
+ * 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Inet4 extends Type {
+  @Override
+  public TajoDataTypes.Type baseType() {
+    return TajoDataTypes.Type.INET4;
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-common/src/main/java/org/apache/tajo/type/Interval.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Interval.java b/tajo-common/src/main/java/org/apache/tajo/type/Interval.java
new file mode 100644
index 0000000..6c99526
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Interval.java
@@ -0,0 +1,28 @@
+/**
+ * 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Interval extends Type {
+  @Override
+  public TajoDataTypes.Type baseType() {
+    return TajoDataTypes.Type.INTERVAL;
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-common/src/main/java/org/apache/tajo/type/Null.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Null.java b/tajo-common/src/main/java/org/apache/tajo/type/Null.java
new file mode 100644
index 0000000..fe823e1
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Null.java
@@ -0,0 +1,28 @@
+/**
+ * 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Null extends Type {
+  @Override
+  public TajoDataTypes.Type baseType() {
+    return TajoDataTypes.Type.NULL_TYPE;
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-common/src/main/java/org/apache/tajo/type/Protobuf.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Protobuf.java b/tajo-common/src/main/java/org/apache/tajo/type/Protobuf.java
new file mode 100644
index 0000000..59d3c1a
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Protobuf.java
@@ -0,0 +1,42 @@
+/**
+ * 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.type;
+
+import org.apache.tajo.common.TajoDataTypes;
+
+public class Protobuf extends Type {
+  private String msgName;
+
+  public Protobuf(String msgName) {
+    this.msgName = msgName;
+  }
+
+  public String getMessageName() {
+    return this.msgName;
+  }
+
+  @Override
+  public TajoDataTypes.Type baseType() {
+    return TajoDataTypes.Type.PROTOBUF;
+  }
+
+  public boolean hasParam() {
+    return true;
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-common/src/main/java/org/apache/tajo/type/Type.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Type.java b/tajo-common/src/main/java/org/apache/tajo/type/Type.java
index 363ffc4..e1a7180 100644
--- a/tajo-common/src/main/java/org/apache/tajo/type/Type.java
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Type.java
@@ -24,8 +24,13 @@ import java.util.Arrays;
 import java.util.Collection;
 
 public abstract class Type {
+
   public abstract TajoDataTypes.Type baseType();
 
+  public boolean hasParam() {
+    return false;
+  }
+
   protected static String typeName(TajoDataTypes.Type type) {
     return type.name().toLowerCase();
   }
@@ -48,6 +53,14 @@ public abstract class Type {
     return typeName(baseType());
   }
 
+  public boolean isStruct() {
+    return this.baseType() == TajoDataTypes.Type.RECORD;
+  }
+
+  public static Any Any() {
+    return Any.INSTANCE;
+  }
+
   public static Bool Bool() {
     return new Bool();
   }
@@ -94,6 +107,10 @@ public abstract class Type {
     return new Timestamp();
   }
 
+  public static Interval Interval() {
+    return new Interval();
+  }
+
   public static Char Char(int len) {
     return new Char(len);
   }
@@ -110,6 +127,10 @@ public abstract class Type {
     return new Blob();
   }
 
+  public static Inet4 Inet4() {
+    return new Inet4();
+  }
+
   public static Struct Struct(Collection<Type> types) {
     return new Struct(types);
   }
@@ -125,4 +146,8 @@ public abstract class Type {
   public static Map Map(Type keyType, Type valueType) {
     return new Map(keyType, valueType);
   }
+
+  public static Null Null() {
+    return new Null();
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-common/src/main/java/org/apache/tajo/type/Varchar.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/type/Varchar.java b/tajo-common/src/main/java/org/apache/tajo/type/Varchar.java
index 6dc2c50..fbfac17 100644
--- a/tajo-common/src/main/java/org/apache/tajo/type/Varchar.java
+++ b/tajo-common/src/main/java/org/apache/tajo/type/Varchar.java
@@ -39,6 +39,11 @@ public class Varchar extends Type {
   }
 
   @Override
+  public boolean hasParam() {
+    return true;
+  }
+
+  @Override
   public String toString() {
     return "varchar(" + length + ")";
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 51a017e..8790a38 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,17 +37,19 @@ public class TestDDLBuilder {
   private static final PartitionMethodDesc partitionMethod1;
 
   static {
-    schema1 = SchemaFactory.newV1();
-    schema1.addColumn("name", TajoDataTypes.Type.BLOB);
-    schema1.addColumn("addr", TajoDataTypes.Type.TEXT);
+    schema1 = SchemaBuilder.builder()
+        .add("name", TajoDataTypes.Type.BLOB)
+        .add("addr", TajoDataTypes.Type.TEXT)
+        .build();
 
     meta1 = CatalogUtil.newTableMeta("TEXT");
     meta1.putProperty(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER);
     meta1.putProperty(StorageConstants.COMPRESSION_CODEC, GzipCodec.class.getName());
 
-    Schema expressionSchema = SchemaFactory.newV1();
-    expressionSchema.addColumn("key", TajoDataTypes.Type.INT4);
-    expressionSchema.addColumn("key2", TajoDataTypes.Type.TEXT);
+    Schema expressionSchema = SchemaBuilder.builder()
+        .add("key", TajoDataTypes.Type.INT4)
+        .add("key2", TajoDataTypes.Type.TEXT)
+        .build();
     partitionMethod1 = new PartitionMethodDesc(
         "db1",
         "table1",
@@ -67,15 +69,17 @@ public class TestDDLBuilder {
 
   @Test
   public void testBuildDDLQuotedTableName() throws Exception {
-    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 = SchemaFactory.newV1();
-    expressionSchema2.addColumn("BirthYear", TajoDataTypes.Type.INT4);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("name", TajoDataTypes.Type.BLOB)
+        .add("addr", TajoDataTypes.Type.TEXT)
+        .add("FirstName", TajoDataTypes.Type.TEXT)
+        .add("LastName", TajoDataTypes.Type.TEXT)
+        .add("with", TajoDataTypes.Type.TEXT)
+        .build();
+
+    Schema expressionSchema2 = SchemaBuilder.builder()
+        .add("BirthYear", TajoDataTypes.Type.INT4)
+        .build();
 
     PartitionMethodDesc partitionMethod2 = new PartitionMethodDesc(
         "db1",

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCliNegatives.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCliNegatives.java b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCliNegatives.java
index aea82ab..0fd29d9 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCliNegatives.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/cli/tsql/TestTajoCliNegatives.java
@@ -124,7 +124,7 @@ public class TestTajoCliNegatives extends QueryTestCaseBase {
       client.updateQuery("CREATE TABLE TestTajoCliNegatives.table12u79 ( name RECORD(last TEXT, first TEXT) )");
 
       assertScriptFailure("select name FROM TestTajoCliNegatives.table12u79",
-          "ERROR: not implemented feature: record field projection\n");
+          "ERROR: org.apache.tajo.exception.NotImplementedException: not implemented feature: record projection\n");
 
     } finally {
       client.updateQuery("DROP TABLE IF EXISTS TestTajoCliNegatives.table12u79");

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 6abc3fb..d2b3a78 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
@@ -22,8 +22,7 @@ import org.apache.hadoop.fs.Path;
 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.SchemaBuilder;
 import org.apache.tajo.catalog.TableMeta;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.exception.*;
@@ -68,20 +67,20 @@ public class TestCatalogAdminClientExceptions extends QueryTestCaseBase {
 
   @Test(expected = UnavailableTableLocationException.class)
   public final void testCreateExternalTableUnavailableLocation() throws TajoException {
-    client.createExternalTable("table128237", SchemaFactory.newV1(), URI.create("/tajo/test1bcd"),
+    client.createExternalTable("table128237", SchemaBuilder.empty(), URI.create("/tajo/test1bcd"),
         new TableMeta("TEXT", new KeyValueSet()));
   }
 
   @Test(expected = DuplicateTableException.class)
   public final void testCreateExternalTableDuplicated() throws TajoException {
-    client.createExternalTable("default.lineitem", SchemaFactory.newV1(), URI.create("/"),
+    client.createExternalTable("default.lineitem", SchemaBuilder.empty(), 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", SchemaFactory.newV1(), p.toUri(),
+    client.createExternalTable("information_schema.table1237891", SchemaBuilder.empty(), p.toUri(),
         new TableMeta("TEXT", new KeyValueSet()));
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 cdb86a1..adbfd48 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,7 +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.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.NullDatum;
 import org.apache.tajo.engine.eval.ExprTestBase;
@@ -30,18 +30,20 @@ import org.junit.Test;
 
 public class TestEvalCodeGenerator extends ExprTestBase {
   private static Schema schema;
+
   static {
-    schema = SchemaFactory.newV1();
-    schema.addColumn("col0", TajoDataTypes.Type.INT1);
-    schema.addColumn("col1", TajoDataTypes.Type.INT2);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT8);
-    schema.addColumn("col4", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col6", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3));
-    schema.addColumn("col8", TajoDataTypes.Type.BOOLEAN);
-    schema.addColumn("nullable", TajoDataTypes.Type.NULL_TYPE);
+    schema = SchemaBuilder.builder()
+        .add("col0", TajoDataTypes.Type.INT1)
+        .add("col1", TajoDataTypes.Type.INT2)
+        .add("col2", TajoDataTypes.Type.INT4)
+        .add("col3", TajoDataTypes.Type.INT8)
+        .add("col4", TajoDataTypes.Type.FLOAT4)
+        .add("col5", TajoDataTypes.Type.FLOAT8)
+        .add("col6", TajoDataTypes.Type.TEXT)
+        .add("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3))
+        .add("col8", TajoDataTypes.Type.BOOLEAN)
+        .add("nullable", TajoDataTypes.Type.NULL_TYPE)
+        .build();
   }
 
   @Test
@@ -66,18 +68,19 @@ public class TestEvalCodeGenerator extends ExprTestBase {
 
   @Test
   public void testNullHandling() throws TajoException {
-    schema = SchemaFactory.newV1();
-    schema.addColumn("col0", TajoDataTypes.Type.INT1);
-    schema.addColumn("col1", TajoDataTypes.Type.INT2);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT8);
-    schema.addColumn("col4", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col6", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 1));
-    schema.addColumn("col8", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3));
-    schema.addColumn("col9", TajoDataTypes.Type.BOOLEAN);
-    schema.addColumn("nullable", TajoDataTypes.Type.NULL_TYPE);
+    schema = SchemaBuilder.builder()
+        .add("col0", TajoDataTypes.Type.INT1)
+        .add("col1", TajoDataTypes.Type.INT2)
+        .add("col2", TajoDataTypes.Type.INT4)
+        .add("col3", TajoDataTypes.Type.INT8)
+        .add("col4", TajoDataTypes.Type.FLOAT4)
+        .add("col5", TajoDataTypes.Type.FLOAT8)
+        .add("col6", TajoDataTypes.Type.TEXT)
+        .add("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 1))
+        .add("col8", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3))
+        .add("col9", TajoDataTypes.Type.BOOLEAN)
+        .add("nullable", TajoDataTypes.Type.NULL_TYPE)
+        .build();
 
     testEval(schema, "table1", ",1,2,3,4.5,6.5,F6,abc,abc,t", "select col0 is null from table1;", new String [] {"t"});
     testEval(schema, "table1", "0,,2,3,4.5,6.5,F6,abc,abc,t,", "select col1 is null from table1;", new String [] {"t"});
@@ -106,9 +109,10 @@ public class TestEvalCodeGenerator extends ExprTestBase {
 
   @Test
   public void testComparison() throws TajoException {
-    Schema inetSchema = SchemaFactory.newV1();
-    inetSchema.addColumn("addr1", TajoDataTypes.Type.INET4);
-    inetSchema.addColumn("addr2", TajoDataTypes.Type.INET4);
+    Schema inetSchema = SchemaBuilder.builder()
+        .add("addr1", TajoDataTypes.Type.INET4)
+        .add("addr2", TajoDataTypes.Type.INET4)
+        .build();
 
     testSimpleEval("select (1 > null AND false)", new String[] {"f"}); // unknown - false -> false
     testSimpleEval("select (1::int8 > null) is null", new String[] {"t"});
@@ -162,9 +166,10 @@ public class TestEvalCodeGenerator extends ExprTestBase {
 
   @Test
   public void testBetweenAsymmetric() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TajoDataTypes.Type.INT4);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TajoDataTypes.Type.INT4)
+        .add("col2", TajoDataTypes.Type.INT4)
+        .build();
     testEval(schema, "table1", "0,", "select col1 between 1 and 3 from table1", new String[]{"f"});
     testEval(schema, "table1", "1,", "select col1 between 1 and 3 from table1", new String[]{"t"});
     testEval(schema, "table1", "2,", "select col1 between 1 and 3 from table1", new String[]{"t"});
@@ -196,9 +201,10 @@ public class TestEvalCodeGenerator extends ExprTestBase {
 
   @Test
   public void testBetweenSymmetric() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TajoDataTypes.Type.INT4);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TajoDataTypes.Type.INT4)
+        .add("col2", TajoDataTypes.Type.INT4)
+        .build();
     testEval(schema, "table1", "0,", "select col1 between symmetric 1 and 3 from table1", new String[]{"f"});
     testEval(schema, "table1", "1,", "select col1 between symmetric 1 and 3 from table1", new String[]{"t"});
     testEval(schema, "table1", "2,", "select col1 between symmetric 1 and 3 from table1", new String[]{"t"});
@@ -231,16 +237,16 @@ public class TestEvalCodeGenerator extends ExprTestBase {
 
   @Test
   public void testUnary() throws TajoException {
-    schema = SchemaFactory.newV1();
-    schema.addColumn("col0", TajoDataTypes.Type.INT1);
-    schema.addColumn("col1", TajoDataTypes.Type.INT2);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT8);
-    schema.addColumn("col4", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col6", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3));
-    schema.addColumn("col8", TajoDataTypes.Type.BOOLEAN);
+    schema = SchemaBuilder.builder()
+    .add("col0", TajoDataTypes.Type.INT1)
+    .add("col1", TajoDataTypes.Type.INT2)
+    .add("col2", TajoDataTypes.Type.INT4)
+    .add("col3", TajoDataTypes.Type.INT8)
+    .add("col4", TajoDataTypes.Type.FLOAT4)
+    .add("col5", TajoDataTypes.Type.FLOAT8)
+    .add("col6", TajoDataTypes.Type.TEXT)
+    .add("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3))
+    .add("col8", TajoDataTypes.Type.BOOLEAN).build();
 
 
     // sign test
@@ -303,9 +309,10 @@ 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 = SchemaFactory.newV1();
-    schema.addColumn("col1", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col2", TajoDataTypes.Type.TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TajoDataTypes.Type.TEXT)
+        .add("col2", TajoDataTypes.Type.TEXT)
+        .build();
     testEval(schema, "table1", " trim, abc", "select ltrim(col1) || ltrim(col2) from table1",
         new String[]{"trimabc"});
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 0b33626..e74b108 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,7 +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.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.datum.Datum;
@@ -43,9 +43,10 @@ public class TestEvalTree extends ExprTestBase {
     FieldEval e2 = new FieldEval("table1.score", CatalogUtil.newSimpleDataType(INT4)); // it indicates
     assertCloneEqual(e2);
 
-    Schema schema1 = SchemaFactory.newV1();
-    schema1.addColumn("table1.id", INT4);
-    schema1.addColumn("table1.score", INT4);
+    Schema schema1 = SchemaBuilder.builder()
+        .add("table1.id", INT4)
+        .add("table1.score", INT4)
+        .build();
     
     BinaryEval expr = new BinaryEval(EvalType.PLUS, e1, e2);
     expr.bind(null, schema1);
@@ -396,7 +397,7 @@ public class TestEvalTree extends ExprTestBase {
       assertEquals(caseWhenEval.bind(null, null).eval(null).asInt4(), 1);
     }
 
-    Schema schema = SchemaFactory.newV1(new Column[]{new Column("test", TajoDataTypes.Type.INT4)});
+    Schema schema = SchemaBuilder.builder().addAll(new Column[]{new Column("test", TajoDataTypes.Type.INT4)}).build();
     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/4aef83a3/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 9192235..2846f22 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
@@ -31,9 +31,9 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.engine.function.FunctionLoader;
-import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.parser.sql.SQLAnalyzer;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.LogicalPlanner;
 import org.apache.tajo.plan.Target;
@@ -97,10 +97,11 @@ public class TestEvalTreeUtil {
     catalog.createTablespace(DEFAULT_TABLESPACE_NAME, "hdfs://localhost:1234/warehouse");
     catalog.createDatabase(TajoConstants.DEFAULT_DATABASE_NAME, DEFAULT_TABLESPACE_NAME);
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("name", TajoDataTypes.Type.TEXT);
-    schema.addColumn("score", TajoDataTypes.Type.INT4);
-    schema.addColumn("age", TajoDataTypes.Type.INT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("name", TajoDataTypes.Type.TEXT)
+        .add("score", TajoDataTypes.Type.INT4)
+        .add("age", TajoDataTypes.Type.INT4)
+        .build();
 
     TableMeta meta = CatalogUtil.newTableMeta("TEXT");
     TableDesc desc = new TableDesc(

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 c3cd0a0..cc9da7f 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,17 +20,26 @@ 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.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.exception.TajoException;
 import org.junit.Test;
 
-import static org.apache.tajo.common.TajoDataTypes.Type.BOOLEAN;
-import static org.apache.tajo.common.TajoDataTypes.Type.INT4;
-import static org.apache.tajo.common.TajoDataTypes.Type.TEXT;
+import static org.apache.tajo.common.TajoDataTypes.Type.*;
 
 public class TestPredicates extends ExprTestBase {
 
+  public static final Schema FourIntSchema;
+
+  static {
+    FourIntSchema = SchemaBuilder.builder()
+        .add("col1", INT4)
+        .add("col2", INT4)
+        .add("col3", INT4)
+        .add("col4", INT4)
+        .build();
+  }
+
   //////////////////////////////////////////////////////////////////
   // Logical Operator
   //////////////////////////////////////////////////////////////////
@@ -87,10 +96,11 @@ public class TestPredicates extends ExprTestBase {
 
     testSimpleEval("select (not (1 > null)) is null;", new String[] {"t"});
 
-    Schema schema1 = SchemaFactory.newV1();
-    schema1.addColumn("col1", INT4);
-    schema1.addColumn("col2", INT4);
-    schema1.addColumn("col3", INT4);
+    Schema schema1 = SchemaBuilder.builder()
+        .add("col1", INT4)
+        .add("col2", INT4)
+        .add("col3", INT4)
+        .build();
 
     testEval(schema1,
         "table1", "123,123,456,-123",
@@ -111,26 +121,22 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testComparisonEqual() throws TajoException {
-
-
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col0", TajoDataTypes.Type.INT1);
-    schema.addColumn("col1", TajoDataTypes.Type.INT2);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT8);
-    schema.addColumn("col4", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col6", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3));
-    schema.addColumn("nullable", TajoDataTypes.Type.INT4);
+    Schema schema = SchemaBuilder.builder()
+        .add("col0", TajoDataTypes.Type.INT1)
+        .add("col1", TajoDataTypes.Type.INT2)
+        .add("col2", TajoDataTypes.Type.INT4)
+        .add("col3", TajoDataTypes.Type.INT8)
+        .add("col4", TajoDataTypes.Type.FLOAT4)
+        .add("col5", TajoDataTypes.Type.FLOAT8)
+        .add("col6", TajoDataTypes.Type.TEXT)
+        .add("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3))
+        .add("nullable", TajoDataTypes.Type.INT4)
+        .build();
 
     testEval(schema, "t1", "0,1,2,3,4.1,5.1,cmp,asm,", "SELECT col6 = 'cmp' from t1", new String [] {"t"});
 
-    Schema schema1 = SchemaFactory.newV1();
-    schema1.addColumn("col1", INT4);
-    schema1.addColumn("col2", INT4);
-    schema1.addColumn("col3", INT4);
-    schema1.addColumn("col4", INT4);
+    Schema schema1 = FourIntSchema;
+
     testEval(schema1,
         "table1", "123,123,456,-123",
         "select col1 = col2, col1 = col3, col1 = col4 from table1",
@@ -143,11 +149,8 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testComparisonNotEqual() throws TajoException {
-    Schema schema1 = SchemaFactory.newV1();
-    schema1.addColumn("col1", INT4);
-    schema1.addColumn("col2", INT4);
-    schema1.addColumn("col3", INT4);
-    schema1.addColumn("col4", INT4);
+    Schema schema1 = FourIntSchema;
+
     testEval(schema1,
         "table1", "123,123,456,-123",
         "select col1 <> col2, col1 <> col3, col1 <> col4 from table1",
@@ -160,11 +163,8 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testComparisonLessThan() throws TajoException {
-    Schema schema1 = SchemaFactory.newV1();
-    schema1.addColumn("col1", INT4);
-    schema1.addColumn("col2", INT4);
-    schema1.addColumn("col3", INT4);
-    schema1.addColumn("col4", INT4);
+    Schema schema1 = FourIntSchema;
+
     testEval(schema1,
         "table1", "123,123,456,-123",
         "select col1 < col2, col1 < col3, col1 < col4 from table1",
@@ -177,11 +177,8 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testComparisonLessThanEqual() throws TajoException {
-    Schema schema1 = SchemaFactory.newV1();
-    schema1.addColumn("col1", INT4);
-    schema1.addColumn("col2", INT4);
-    schema1.addColumn("col3", INT4);
-    schema1.addColumn("col4", INT4);
+    Schema schema1 = FourIntSchema;
+
     testEval(schema1,
         "table1", "123,123,456,-123",
         "select col1 <= col2, col1 <= col3, col1 <= col4 from table1",
@@ -194,11 +191,8 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testComparisonGreaterThan() throws TajoException {
-    Schema schema1 = SchemaFactory.newV1();
-    schema1.addColumn("col1", INT4);
-    schema1.addColumn("col2", INT4);
-    schema1.addColumn("col3", INT4);
-    schema1.addColumn("col4", INT4);
+    Schema schema1 = FourIntSchema;
+
     testEval(schema1,
         "table1", "123,123,456,-123",
         "select col1 > col2, col3 > col2, col1 > col4 from table1",
@@ -211,11 +205,8 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testComparisonGreaterThanEqual() throws TajoException {
-    Schema schema1 = SchemaFactory.newV1();
-    schema1.addColumn("col1", INT4);
-    schema1.addColumn("col2", INT4);
-    schema1.addColumn("col3", INT4);
-    schema1.addColumn("col4", INT4);
+    Schema schema1 = FourIntSchema;
+
     testEval(schema1,
         "table1", "123,123,456,-123",
         "select col1 >= col2, col3 >= col2, col1 >= col4 from table1",
@@ -232,10 +223,11 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testBetween() throws TajoException {
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("col1", TEXT);
-    schema2.addColumn("col2", TEXT);
-    schema2.addColumn("col3", TEXT);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
 
     // constant checker
     testEval(schema2, "table1", "b,a,c", "select col1 between 'a' and 'c' from table1", new String[]{"t"});
@@ -256,11 +248,12 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testBetween2() throws TajoException { // for TAJO-249
-    Schema schema3 = SchemaFactory.newV1();
-    schema3.addColumn("date_a", INT4);
-    schema3.addColumn("date_b", INT4);
-    schema3.addColumn("date_c", INT4);
-    schema3.addColumn("date_d", INT4);
+    Schema schema3 = SchemaBuilder.builder()
+        .add("date_a", INT4)
+        .add("date_b", INT4)
+        .add("date_c", INT4)
+        .add("date_d", INT4)
+        .build();
 
     String query = "select " +
         "case " +
@@ -295,10 +288,11 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testInPredicateWithConstant() throws TajoException {
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("col1", TEXT);
-    schema2.addColumn("col2", TEXT);
-    schema2.addColumn("col3", TEXT);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .add("col3", TEXT)
+        .build();
 
     testEval(schema2, "table1", "a,b,c", "select col1 in ('a'), col2 in ('a', 'c') from table1", new String[]{"t","f"});
     testEval(schema2, "table1", "a,,c", "select col1 in ('a','b','c'), (col2 in ('a', 'c')) is null from table1",
@@ -320,10 +314,11 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testInPredicateWithSimpleExprs() throws TajoException {
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("col1", TEXT);
-    schema2.addColumn("col2", INT4);
-    schema2.addColumn("col3", TEXT);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", INT4)
+        .add("col3", TEXT)
+        .build();
 
     testEval(schema2, "table1", "abc,2,3", "select col1 in ('a'||'b'||'c'), col2 in (1 + 1, 2 * 10, 2003) from table1",
         new String[]{"t","t"});
@@ -344,9 +339,10 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testIsNullPredicate() throws TajoException {
-    Schema schema1 = SchemaFactory.newV1();
-    schema1.addColumn("col1", INT4);
-    schema1.addColumn("col2", INT4);
+    Schema schema1 = SchemaBuilder.builder()
+        .add("col1", INT4)
+        .add("col2", INT4)
+        .build();
     testEval(schema1, "table1", "123,", "select col1 is null, col2 is null as a from table1",
         new String[]{"f", "t"});
     testEval(schema1, "table1", "123,", "select col1 is not null, col2 is not null as a from table1",
@@ -355,9 +351,10 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testIsNullPredicateWithFunction() throws TajoException {
-    Schema schema2 = SchemaFactory.newV1();
-    schema2.addColumn("col1", TEXT);
-    schema2.addColumn("col2", TEXT);
+    Schema schema2 = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .build();
     testEval(schema2, "table1", "_123,", "select ltrim(col1, '_') is null, upper(col2) is null as a from table1",
         new String[]{"f", "t"});
 
@@ -394,9 +391,10 @@ public class TestPredicates extends ExprTestBase {
 
   @Test
   public void testBooleanTestOnTable() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", BOOLEAN);
-    schema.addColumn("col2", BOOLEAN);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", BOOLEAN)
+        .add("col2", BOOLEAN)
+        .build();
     testEval(schema, "table1", "t,f", "select col1 is true, col2 is false from table1", new String [] {"t", "t"});
     testEval(schema, "table1", "t,f", "select col1 is not true, col2 is not false from table1",
         new String [] {"f", "f"});

http://git-wip-us.apache.org/repos/asf/tajo/blob/4aef83a3/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 fa4561a..293b02a 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,13 +21,13 @@ 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.catalog.SchemaBuilder;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.DatumFactory;
 import org.apache.tajo.datum.TimestampDatum;
 import org.apache.tajo.engine.query.QueryContext;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.exception.UndefinedFunctionException;
 import org.apache.tajo.util.datetime.DateTimeUtil;
 import org.junit.Test;
 
@@ -40,9 +40,9 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testQuotedIdentifiers() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("컬럼1", TEXT);
-    schema.addColumn("컬럼2", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("컬럼1", TEXT)
+        .add("컬럼2", TEXT).build();
     testEval(schema, "테이블1", "123,234", "select \"컬럼1\"::float, cast (\"컬럼2\" as float4) as a from \"테이블1\"",
         new String[]{"123.0", "234.0"});
     testEval(schema,
@@ -92,17 +92,24 @@ public class TestSQLExpression extends ExprTestBase {
     testSimpleEval("select cast (123.0 as double)", new String[] {"123.0"});
   }
 
+  private static final Schema TestSchema1;
+
+  static {
+    TestSchema1 = SchemaBuilder.builder()
+        .add("col0", INT1)
+        .add("col1", INT2)
+        .add("col2", INT4)
+        .add("col3", INT8)
+        .add("col4", FLOAT4)
+        .add("col5", FLOAT8)
+        .add("col6", TEXT)
+        .add("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3))
+        .build();
+  }
+
   @Test
   public void testExplicitCast() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col0", INT1);
-    schema.addColumn("col1", INT2);
-    schema.addColumn("col2", INT4);
-    schema.addColumn("col3", INT8);
-    schema.addColumn("col4", FLOAT4);
-    schema.addColumn("col5", FLOAT8);
-    schema.addColumn("col6", TEXT);
-    schema.addColumn("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3));
+    Schema schema = TestSchema1;
 
     testSimpleEval("select cast (1 as char)", new String[]{"1"});
     testSimpleEval("select cast (119 as char)", new String[] {"1"});
@@ -174,15 +181,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testImplicitCastForInt1() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col0", TajoDataTypes.Type.INT1);
-    schema.addColumn("col1", TajoDataTypes.Type.INT2);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT8);
-    schema.addColumn("col4", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col6", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3));
+    Schema schema = TestSchema1;
 
     testEval(schema, "table1", "0,1,2,3,4.1,5.1,6,7", "select col0 + col0 from table1;", new String [] {"0"});
     testEval(schema, "table1", "0,1,2,3,4.1,5.1,6,7", "select col0 + col1 from table1;", new String [] {"1"});
@@ -276,15 +275,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testImplicitCastForInt2() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col0", TajoDataTypes.Type.INT1);
-    schema.addColumn("col1", TajoDataTypes.Type.INT2);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT8);
-    schema.addColumn("col4", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col6", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3));
+    Schema schema = TestSchema1;
 
     testEval(schema, "table1", "0,1,2,3,4.1,5.1,6,7", "select col1 + col0 from table1;", new String [] {"1"});
     testEval(schema, "table1", "0,1,2,3,4.1,5.1,6,7", "select col1 + col1 from table1;", new String [] {"2"});
@@ -378,15 +369,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testImplicitCastForInt4() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col0", TajoDataTypes.Type.INT1);
-    schema.addColumn("col1", TajoDataTypes.Type.INT2);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT8);
-    schema.addColumn("col4", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col6", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3));
+    Schema schema = TestSchema1;
 
     testEval(schema, "table1", "0,1,2,3,4.1,5.1,6,7", "select col2 + col0 from table1;", new String [] {"2"});
     testEval(schema, "table1", "0,1,2,3,4.1,5.1,6,7", "select col2 + col1 from table1;", new String [] {"3"});
@@ -481,15 +464,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testImplicitCastForInt8() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col0", TajoDataTypes.Type.INT1);
-    schema.addColumn("col1", TajoDataTypes.Type.INT2);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT8);
-    schema.addColumn("col4", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col6", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3));
+    Schema schema = TestSchema1;
 
     testEval(schema, "table1", "0,1,2,3,4.1,5.1,6,7", "select col3 + col0 from table1;", new String[]{"3"});
     testEval(schema, "table1", "0,1,2,3,4.1,5.1,6,7", "select col3 + col1 from table1;", new String [] {"4"});
@@ -588,15 +563,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testImplicitCastForFloat4() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col0", TajoDataTypes.Type.INT1);
-    schema.addColumn("col1", TajoDataTypes.Type.INT2);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT8);
-    schema.addColumn("col4", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col6", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3));
+    Schema schema = TestSchema1;
 
     testEval(schema, "table1", "0,1,2,3,4.1,5.1,6,7", "select col4 + col0 from table1;", new String [] {"4.1"});
     testEval(schema, "table1", "0,1,2,3,4.1,5.1,6,7", "select col4 + col1 from table1;", new String [] {"5.1"});
@@ -707,15 +674,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testImplicitCastForFloat8() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col0", TajoDataTypes.Type.INT1);
-    schema.addColumn("col1", TajoDataTypes.Type.INT2);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT8);
-    schema.addColumn("col4", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col6", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3));
+    Schema schema = TestSchema1;
 
     testEval(schema, "table1", "0,1,2,3,4.1,5.1,6,7", "select col5 + col0 from table1;", new String [] {"5.1"});
     testEval(schema, "table1", "0,1,2,3,4.1,5.1,6,7", "select col5 + col1 from table1;", new String [] {"6.1"});
@@ -827,17 +786,7 @@ public class TestSQLExpression extends ExprTestBase {
 
   @Test
   public void testSigned() throws TajoException {
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col0", TajoDataTypes.Type.INT1);
-    schema.addColumn("col1", TajoDataTypes.Type.INT2);
-    schema.addColumn("col2", TajoDataTypes.Type.INT4);
-    schema.addColumn("col3", TajoDataTypes.Type.INT8);
-    schema.addColumn("col4", TajoDataTypes.Type.FLOAT4);
-    schema.addColumn("col5", TajoDataTypes.Type.FLOAT8);
-    schema.addColumn("col6", TajoDataTypes.Type.TEXT);
-    schema.addColumn("col7", CatalogUtil.newDataType(TajoDataTypes.Type.CHAR, "", 3));
-    schema.addColumn("col8", TajoDataTypes.Type.BOOLEAN);
-
+    Schema schema = TestSchema1;
 
     // sign test
     testEval(schema, "table1", "0,1,2,3,4.1,5.1,6,7,t", "select +col1 from table1;", new String [] {"1"});
@@ -871,9 +820,10 @@ public class TestSQLExpression extends ExprTestBase {
     queryContext.put(SessionVars.TIMEZONE, "GMT-6");
     TimeZone tz = TimeZone.getTimeZone("GMT-6");
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .build();
 
     testEval(queryContext, schema,
         "table1",
@@ -903,9 +853,10 @@ public class TestSQLExpression extends ExprTestBase {
     testSimpleEval("select true", new String[] {"t"});
     testSimpleEval("select false", new String[]{"f"});
 
-    Schema schema = SchemaFactory.newV1();
-    schema.addColumn("col1", TEXT);
-    schema.addColumn("col2", TEXT);
+    Schema schema = SchemaBuilder.builder()
+        .add("col1", TEXT)
+        .add("col2", TEXT)
+        .build();
     testEval(schema, "table1", "123,234", "select col1, col2 from table1 where true", new String[]{"123", "234"});
   }