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

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

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"});
   }