You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2015/09/01 11:55:55 UTC

[2/2] tajo git commit: TAJO-1803: Use in-memory derby as the default catalog for unit tests.

TAJO-1803: Use in-memory derby as the default catalog for unit tests.

Closes #714


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

Branch: refs/heads/master
Commit: 77dc88c074646c2673d11b1c026b33ead2640d1b
Parents: 848a8c3
Author: Jihoon Son <ji...@apache.org>
Authored: Tue Sep 1 18:55:20 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Tue Sep 1 18:55:20 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |   3 +
 .../org/apache/tajo/catalog/AlterTableDesc.java |  18 +
 .../org/apache/tajo/catalog/CatalogUtil.java    |   9 +-
 .../src/main/proto/CatalogProtos.proto          |   1 +
 .../tajo-catalog-drivers/tajo-hive/pom.xml      |  15 +-
 .../tajo/catalog/store/HiveCatalogStore.java    |   7 +
 tajo-catalog/tajo-catalog-server/pom.xml        |  11 +-
 .../org/apache/tajo/catalog/CatalogServer.java  |   4 +
 .../tajo/catalog/store/AbstractDBStore.java     | 111 ++-
 .../apache/tajo/catalog/store/CatalogStore.java |   4 +-
 .../apache/tajo/catalog/store/DerbyStore.java   |  11 +-
 .../org/apache/tajo/catalog/store/MemStore.java | 785 -------------------
 .../apache/tajo/catalog/CatalogTestingUtil.java |  91 +++
 .../org/apache/tajo/catalog/TestCatalog.java    |  54 +-
 .../tajo/catalog/TestLinkedMetadataManager.java |   3 +-
 .../apache/tajo/client/SessionConnection.java   |   9 +-
 tajo-cluster-tests/pom.xml                      |   3 +-
 .../org/apache/tajo/CatalogTestingUtil.java     |  92 +++
 .../org/apache/tajo/TajoTestingCluster.java     |  25 +-
 .../apache/tajo/exception/ErrorMessages.java    |   2 +
 .../apache/tajo/exception/ExceptionUtil.java    |   2 +
 .../tajo/exception/UnsupportedCatalogStore.java |  33 +
 tajo-common/src/main/proto/errors.proto         |   3 +
 tajo-core-tests/pom.xml                         |   5 +-
 .../apache/tajo/engine/eval/ExprTestBase.java   |   3 +-
 .../tajo/engine/planner/TestLogicalPlanner.java |   3 +-
 .../planner/physical/TestExternalSortExec.java  |  14 +-
 .../planner/physical/TestPhysicalPlanner.java   |   2 +-
 .../physical/TestProgressExternalSortExec.java  |  25 +-
 .../planner/physical/TestTupleSorter.java       |   4 +-
 .../tajo/engine/query/TestSelectQuery.java      |   7 +-
 tajo-core/pom.xml                               |   1 -
 .../org/apache/tajo/benchmark/BenchmarkSet.java |   5 +-
 .../engine/planner/PhysicalPlannerImpl.java     |  14 +-
 .../planner/physical/ExternalSortExec.java      |   5 -
 .../java/org/apache/tajo/master/TajoMaster.java |  13 +-
 .../apache/tajo/master/exec/DDLExecutor.java    |   5 +-
 tajo-jdbc/pom.xml                               |  10 +
 .../src/main/proto/master_metrics.proto         |   8 +-
 .../org/apache/tajo/plan/LogicalPlanner.java    |  23 +-
 .../plan/rewrite/rules/AccessPathRewriter.java  |   2 +-
 tajo-project/pom.xml                            |   2 +-
 tajo-storage/tajo-storage-common/pom.xml        |   2 +-
 tajo-storage/tajo-storage-hbase/pom.xml         |   2 +-
 tajo-storage/tajo-storage-hdfs/pom.xml          |   2 +-
 45 files changed, 486 insertions(+), 967 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 8fcc1d0..465dcbd 100644
--- a/CHANGES
+++ b/CHANGES
@@ -461,6 +461,9 @@ Release 0.11.0 - unreleased
   
   TASKS
 
+    TAJO-1803: Use in-memory derby as the default catalog for unit tests. 
+    (jihoon)
+
     TAJO-1755: Add documentation for missing built-in functions. (jihoon)
 
     TAJO-1750: Upgrade hadoop dependency to 2.7.1. (jinho)

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/AlterTableDesc.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/AlterTableDesc.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/AlterTableDesc.java
index 9133b6f..a9dccbc 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/AlterTableDesc.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/AlterTableDesc.java
@@ -20,6 +20,7 @@ package org.apache.tajo.catalog;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.annotations.Expose;
+import org.apache.hadoop.fs.Path;
 import org.apache.tajo.catalog.json.CatalogGsonHelper;
 import org.apache.tajo.catalog.partition.PartitionDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
@@ -27,6 +28,8 @@ import org.apache.tajo.common.ProtoObject;
 import org.apache.tajo.json.GsonObject;
 import org.apache.tajo.util.KeyValueSet;
 
+import java.net.URI;
+
 import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTableDescProto;
 
 
@@ -47,6 +50,8 @@ public class AlterTableDesc implements ProtoObject<AlterTableDescProto>, GsonObj
   protected PartitionDesc partitionDesc; //optional
   @Expose
   protected KeyValueSet properties;
+  @Expose
+  protected URI newTablePath; // optional
 
   public AlterTableDesc() {
     init();
@@ -124,6 +129,14 @@ public class AlterTableDesc implements ProtoObject<AlterTableDescProto>, GsonObj
     return this.properties.get(key);
   }
 
+  public void setNewTablePath(Path path) {
+    newTablePath = path.toUri();
+  }
+
+  public URI getNewTablePath() {
+    return newTablePath;
+  }
+
   @Override
   public String toString() {
     Gson gson = new GsonBuilder().setPrettyPrinting().
@@ -141,6 +154,7 @@ public class AlterTableDesc implements ProtoObject<AlterTableDescProto>, GsonObj
     newAlter.addColumn = addColumn;
     newAlter.partitionDesc = partitionDesc;
     newAlter.properties = (KeyValueSet)properties.clone();
+    newAlter.newTablePath = URI.create(newTablePath.toString());
     return newAlter;
   }
 
@@ -198,6 +212,10 @@ public class AlterTableDesc implements ProtoObject<AlterTableDescProto>, GsonObj
       builder.setPartitionDesc(partitionDesc.getProto());
     }
 
+    if (null != this.newTablePath) {
+      builder.setNewTablePath(newTablePath.toString());
+    }
+
     return builder.build();
   }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java
index 63228f6..ac76387 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java
+++ b/tajo-catalog/tajo-catalog-common/src/main/java/org/apache/tajo/catalog/CatalogUtil.java
@@ -24,6 +24,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.tajo.BuiltinStorages;
 import org.apache.tajo.DataTypeUtil;
 import org.apache.tajo.TajoConstants;
+import org.apache.tajo.annotation.Nullable;
 import org.apache.tajo.catalog.partition.PartitionDesc;
 import org.apache.tajo.catalog.partition.PartitionMethodDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
@@ -780,11 +781,15 @@ public class CatalogUtil {
     return alterTableDesc;
   }
 
-  public static AlterTableDesc renameTable(String tableName, String newTableName, AlterTableType alterTableType) {
+  public static AlterTableDesc renameTable(String tableName, String newTableName, AlterTableType alterTableType,
+                                           @Nullable Path newTablePath) {
     final AlterTableDesc alterTableDesc = new AlterTableDesc();
     alterTableDesc.setTableName(tableName);
     alterTableDesc.setNewTableName(newTableName);
     alterTableDesc.setAlterTableType(alterTableType);
+    if (newTablePath != null) {
+      alterTableDesc.setNewTablePath(newTablePath);
+    }
     return alterTableDesc;
   }
 
@@ -986,7 +991,7 @@ public class CatalogUtil {
     Arrays.sort(simpleNames, new ColumnPosComparator(originalSchema));
     StringBuilder sb = new StringBuilder();
     for (String colName : simpleNames) {
-      sb.append(colName).append("_");
+      sb.append(colName).append(",");
     }
     sb.deleteCharAt(sb.length()-1);
     return sb.toString();

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto b/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto
index 3c93604..04b5345 100644
--- a/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto
+++ b/tajo-catalog/tajo-catalog-common/src/main/proto/CatalogProtos.proto
@@ -310,6 +310,7 @@ message AlterTableDescProto {
   required AlterTableType alterTableType = 5;
   optional PartitionDescProto partitionDesc = 6;
   optional KeyValueSetProto params = 7;
+  optional string newTablePath = 8;
 }
 
 message AlterColumnProto {

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-catalog/tajo-catalog-drivers/tajo-hive/pom.xml
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-drivers/tajo-hive/pom.xml b/tajo-catalog/tajo-catalog-drivers/tajo-hive/pom.xml
index b8d15d3..4516b27 100644
--- a/tajo-catalog/tajo-catalog-drivers/tajo-hive/pom.xml
+++ b/tajo-catalog/tajo-catalog-drivers/tajo-hive/pom.xml
@@ -54,11 +54,6 @@
             </goals>
           </execution>
         </executions>
-        <configuration>
-          <excludes>
-            <exclude>derby.log</exclude>
-          </excludes>
-        </configuration>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
@@ -82,6 +77,16 @@
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <systemProperties>
+            <tajo.test>TRUE</tajo.test>
+          </systemProperties>
+          <argLine>-Xms512m -Xmx1024m -XX:MaxPermSize=152m -Dfile.encoding=UTF-8 -Dderby.storage.pageSize=1024 -Dderby.stream.error.file=/dev/null</argLine>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-report-plugin</artifactId>
       </plugin>
     </plugins>

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/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 2b03fec..e2229ba 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
@@ -59,6 +59,7 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
   private static final int CLIENT_POOL_SIZE = 2;
   private final HiveCatalogStoreClientPool clientPool;
   private final String defaultTableSpaceUri;
+  private final String catalogUri;
 
   public HiveCatalogStore(final Configuration conf) {
     if (!(conf instanceof TajoConf)) {
@@ -67,6 +68,7 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
     this.conf = conf;
     this.defaultTableSpaceUri = TajoConf.getWarehouseDir((TajoConf) conf).toString();
     this.clientPool = new HiveCatalogStoreClientPool(CLIENT_POOL_SIZE, conf);
+    this.catalogUri = conf.get(CATALOG_URI);
   }
 
   @Override
@@ -288,6 +290,11 @@ public class HiveCatalogStore extends CatalogConstants implements CatalogStore {
   }
 
   @Override
+  public String getUri() {
+    return catalogUri;
+  }
+
+  @Override
   public void createTablespace(String spaceName, String spaceUri) {
     // SKIP
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-catalog/tajo-catalog-server/pom.xml
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/pom.xml b/tajo-catalog/tajo-catalog-server/pom.xml
index 21c5e1d..b47b599 100644
--- a/tajo-catalog/tajo-catalog-server/pom.xml
+++ b/tajo-catalog/tajo-catalog-server/pom.xml
@@ -52,7 +52,6 @@
         </executions>
         <configuration>
           <excludes>
-            <exclude>derby.log</exclude>
             <exclude>src/main/resources/schemas/**/*.sql</exclude>
           </excludes>
         </configuration>
@@ -116,6 +115,16 @@
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <systemProperties>
+            <tajo.test>TRUE</tajo.test>
+          </systemProperties>
+          <argLine>-Xms512m -Xmx1024m -XX:MaxPermSize=152m -Dfile.encoding=UTF-8 -Dderby.storage.pageSize=1024 -Dderby.stream.error.file=/dev/null</argLine>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-report-plugin</artifactId>
       </plugin>
     </plugins>

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
index 6d6d96f..477e49f 100644
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
+++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
@@ -145,6 +145,10 @@ public class CatalogServer extends AbstractService {
     return store.getClass().getCanonicalName();
   }
 
+  public String getStoreUri() {
+    return store.getUri();
+  }
+
   private void initBuiltinFunctions(Collection<FunctionDesc> functions)
       throws ServiceException {
     for (FunctionDesc desc : functions) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/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 cd8dcb6..f33b621 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
@@ -26,10 +26,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.tajo.annotation.Nullable;
-import org.apache.tajo.catalog.CatalogConstants;
-import org.apache.tajo.catalog.CatalogUtil;
-import org.apache.tajo.catalog.FunctionDesc;
-import org.apache.tajo.catalog.Schema;
+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;
@@ -41,11 +38,9 @@ import org.apache.tajo.util.Pair;
 import org.apache.tajo.util.TUtil;
 
 import java.io.IOException;
+import java.net.URI;
 import java.sql.*;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto.AlterTablespaceCommand;
 import static org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.KeyValueProto;
@@ -79,6 +74,18 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
   
   protected XMLCatalogSchemaManager catalogSchemaManager;
 
+  public static boolean needShutdown(String catalogUri) {
+    URI uri = URI.create(catalogUri);
+    // If the current catalog is embedded in-memory derby, shutdown is required.
+    if (uri.getHost() == null) {
+      String schemeSpecificPart = uri.getSchemeSpecificPart();
+      if (schemeSpecificPart != null) {
+        return schemeSpecificPart.contains("memory");
+      }
+    }
+    return false;
+  }
+
   protected abstract String getCatalogDriverName();
   
   protected String getCatalogSchemaPath() {
@@ -181,6 +188,10 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
     }
   }
 
+  public String getUri() {
+    return catalogUri;
+  }
+
   public int getDriverVersion() {
     return catalogSchemaManager.getCatalogStore().getSchema().getVersion();
   }
@@ -203,7 +214,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
     try {
       isValid = conn.isValid(timeout);
     } catch (SQLException e) {
-      e.printStackTrace();
+      LOG.warn(e);
     }
     return isValid;
   }
@@ -216,7 +227,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
         conn = createConnection(conf);
       }
     } catch (SQLException e) {
-      e.printStackTrace();
+      throw new TajoInternalError(e);
     }
     return conn;
   }
@@ -760,8 +771,8 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
   }
 
   enum TableType {
-    BASE_TABLE,
-    EXTERNAL_TABLE
+    MANAGED,
+    EXTERNAL
   }
 
   @Override
@@ -800,9 +811,9 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
       pstmt.setInt(1, dbid);
       pstmt.setString(2, tableName);
       if (table.getIsExternal()) {
-        pstmt.setString(3, TableType.EXTERNAL_TABLE.name());
+        pstmt.setString(3, TableType.EXTERNAL.name());
       } else {
-        pstmt.setString(3, TableType.BASE_TABLE.name());
+        pstmt.setString(3, TableType.MANAGED.name());
       }
       pstmt.setString(4, table.getPath());
       pstmt.setString(5, table.getMeta().getStoreType());
@@ -1011,7 +1022,11 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
       if (existTable(databaseName, alterTableDescProto.getNewTableName())) {
         throw new DuplicateTableException(alterTableDescProto.getNewTableName());
       }
-      renameTable(tableId, alterTableDescProto.getNewTableName());
+      if (alterTableDescProto.hasNewTablePath()) {
+        renameManagedTable(tableId, alterTableDescProto.getNewTableName(), alterTableDescProto.getNewTablePath());
+      } else {
+        renameExternalTable(tableId, alterTableDescProto.getNewTableName());
+      }
       break;
     case RENAME_COLUMN:
       if (existColumn(tableId, alterTableDescProto.getAlterColumnName().getNewColumnName())) {
@@ -1119,7 +1134,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
     }
   }
 
-  private void renameTable(final int tableId, final String tableName) {
+  private void renameExternalTable(final int tableId, final String tableName) {
 
     final String updtaeRenameTableSql = "UPDATE " + TB_TABLES + " SET " + COL_TABLES_NAME + " = ? " + " WHERE TID = ?";
 
@@ -1145,6 +1160,34 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
     }
   }
 
+  private void renameManagedTable(final int tableId, final String tableName, final String newTablePath) {
+
+    final String updtaeRenameTableSql = "UPDATE " + TB_TABLES + " SET " + COL_TABLES_NAME + " = ? , PATH = ?"
+        + " WHERE TID = ?";
+
+    if (LOG.isDebugEnabled()) {
+      LOG.debug(updtaeRenameTableSql);
+    }
+
+    Connection conn;
+    PreparedStatement pstmt = null;
+
+    try {
+
+      conn = getConnection();
+      pstmt = conn.prepareStatement(updtaeRenameTableSql);
+      pstmt.setString(1, tableName);
+      pstmt.setString(2, newTablePath);
+      pstmt.setInt(3, tableId);
+      pstmt.executeUpdate();
+
+    } catch (SQLException se) {
+      throw new TajoInternalError(se);
+    } finally {
+      CatalogUtil.closeQuietly(pstmt);
+    }
+  }
+
   private void renameColumn(final int tableId, final CatalogProtos.AlterColumnProto alterColumnProto)
       throws UndefinedColumnException {
 
@@ -1596,7 +1639,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
       int tableId = res.getInt(1);
       tableBuilder.setTableName(CatalogUtil.buildFQName(databaseName, res.getString(2).trim()));
       TableType tableType = TableType.valueOf(res.getString(3));
-      if (tableType == TableType.EXTERNAL_TABLE) {
+      if (tableType == TableType.EXTERNAL) {
         tableBuilder.setIsExternal(true);
       }
 
@@ -1768,7 +1811,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
         TableType tableType = TableType.valueOf(tableTypeString);
         builder.setTableType(tableTypeString);
 
-        if (tableType == TableType.BASE_TABLE) {
+        if (tableType == TableType.MANAGED) {
           builder.setPath(resultSet.getString("SPACE_URI") + "/" + tableName);
         } else {
           builder.setPath(resultSet.getString("PATH"));
@@ -2300,17 +2343,22 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
         LOG.debug(sql);
       }
 
+      final SortSpec[] keySortSpecs = new SortSpec[proto.getKeySortSpecsCount()];
+      for (int i = 0; i < keySortSpecs.length; i++) {
+        keySortSpecs[i] = new SortSpec(proto.getKeySortSpecs(i));
+      }
+
       StringBuilder columnNamesBuilder = new StringBuilder();
       StringBuilder dataTypesBuilder= new StringBuilder();
       StringBuilder ordersBuilder = new StringBuilder();
       StringBuilder nullOrdersBuilder = new StringBuilder();
-      for (SortSpecProto columnSpec : proto.getKeySortSpecsList()) {
+      for (SortSpec columnSpec : keySortSpecs) {
         // Since the key columns are always sorted in order of their occurrence position in the relation schema,
         // the concatenated name can be uniquely identified.
-        columnNamesBuilder.append(columnSpec.getColumn().getName()).append(",");
-        dataTypesBuilder.append(columnSpec.getColumn().getDataType().getType().name()).append(",");
-        ordersBuilder.append(columnSpec.getAscending()).append(",");
-        nullOrdersBuilder.append(columnSpec.getNullFirst()).append(",");
+        columnNamesBuilder.append(columnSpec.getSortKey().getSimpleName()).append(",");
+        dataTypesBuilder.append(columnSpec.getSortKey().getDataType().getType().name()).append(",");
+        ordersBuilder.append(columnSpec.isAscending()).append(",");
+        nullOrdersBuilder.append(columnSpec.isNullFirst()).append(",");
       }
       columnNamesBuilder.deleteCharAt(columnNamesBuilder.length()-1);
       dataTypesBuilder.deleteCharAt(dataTypesBuilder.length()-1);
@@ -2414,9 +2462,9 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
         throw new UndefinedIndexException(indexName);
       }
       IndexDescProto.Builder builder = IndexDescProto.newBuilder();
-      resultToIndexDescProtoBuilder(builder, res);
       String tableName = getTableName(conn, res.getInt(COL_TABLES_PK));
       builder.setTableIdentifier(CatalogUtil.buildTableIdentifier(databaseName, tableName));
+      resultToIndexDescProtoBuilder(CatalogUtil.buildFQName(databaseName, tableName), builder, res);
 
       try {
         builder.setTargetRelationSchema(getTable(databaseName, tableName).getSchema());
@@ -2459,8 +2507,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
       // Since the column names in the unified name are always sorted
       // in order of occurrence position in the relation schema,
       // they can be uniquely identified.
-      String unifiedName = CatalogUtil.buildFQName(databaseName, tableName,
-          CatalogUtil.getUnifiedSimpleColumnName(new Schema(tableDescProto.getSchema()), columnNames));
+      String unifiedName = CatalogUtil.getUnifiedSimpleColumnName(new Schema(tableDescProto.getSchema()), columnNames);
       conn = getConnection();
       pstmt = conn.prepareStatement(sql);
       pstmt.setInt(1, databaseId);
@@ -2472,7 +2519,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
       }
 
       IndexDescProto.Builder builder = IndexDescProto.newBuilder();
-      resultToIndexDescProtoBuilder(builder, res);
+      resultToIndexDescProtoBuilder(CatalogUtil.buildFQName(databaseName, tableName), builder, res);
       builder.setTableIdentifier(CatalogUtil.buildTableIdentifier(databaseName, tableName));
       builder.setTargetRelationSchema(tableDescProto.getSchema());
       proto = builder.build();
@@ -2544,8 +2591,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
       // Since the column names in the unified name are always sorted
       // in order of occurrence position in the relation schema,
       // they can be uniquely identified.
-      String unifiedName = CatalogUtil.buildFQName(databaseName, tableName,
-          CatalogUtil.getUnifiedSimpleColumnName(new Schema(relationSchema), columnNames));
+      String unifiedName = CatalogUtil.getUnifiedSimpleColumnName(new Schema(relationSchema), columnNames);
       conn = getConnection();
       pstmt = conn.prepareStatement(sql);
       pstmt.setInt(1, databaseId);
@@ -2647,7 +2693,8 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
     return indexDescProtos;
   }
 
-  private void resultToIndexDescProtoBuilder(IndexDescProto.Builder builder,
+  private void resultToIndexDescProtoBuilder(final String qualifier,
+                                             final IndexDescProto.Builder builder,
                                              final ResultSet res) throws SQLException {
     builder.setIndexName(res.getString("index_name"));
     builder.setIndexMethod(getIndexMethod(res.getString("index_type").trim()));
@@ -2660,7 +2707,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
     int columnNum = columnNames.length;
     for (int i = 0; i < columnNum; i++) {
       SortSpecProto.Builder colSpecBuilder = SortSpecProto.newBuilder();
-      colSpecBuilder.setColumn(ColumnProto.newBuilder().setName(columnNames[i])
+      colSpecBuilder.setColumn(ColumnProto.newBuilder().setName(CatalogUtil.buildFQName(qualifier, columnNames[i]))
           .setDataType(CatalogUtil.newSimpleDataType(getDataType(dataTypes[i]))).build());
       colSpecBuilder.setAscending(orders[i].equals("true"));
       colSpecBuilder.setNullFirst(nullOrders[i].equals("true"));
@@ -2733,7 +2780,7 @@ public abstract class AbstractDBStore extends CatalogConstants implements Catalo
 
   public void close() {
     CatalogUtil.closeQuietly(conn);
-    LOG.info("Shutdown database (" + catalogUri + ")");
+    LOG.info("Close database (" + catalogUri + ")");
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/CatalogStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/CatalogStore.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/CatalogStore.java
index 64a0e86..38d734f 100644
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/CatalogStore.java
+++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/CatalogStore.java
@@ -18,18 +18,18 @@
 
 package org.apache.tajo.catalog.store;
 
-import com.google.protobuf.InvalidProtocolBufferException;
 import org.apache.tajo.catalog.FunctionDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.catalog.proto.CatalogProtos.*;
 import org.apache.tajo.exception.*;
 
 import java.io.Closeable;
-import java.sql.SQLException;
 import java.util.Collection;
 import java.util.List;
 
 public interface CatalogStore extends Closeable {
+  String getUri();
+
   /*************************** Tablespace ******************************/
   void createTablespace(String spaceName, String spaceUri) throws DuplicateTablespaceException;
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/DerbyStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/DerbyStore.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/DerbyStore.java
index 19a4f13..5e3ff49 100644
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/DerbyStore.java
+++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/DerbyStore.java
@@ -21,6 +21,8 @@
  */
 package org.apache.tajo.catalog.store;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.exception.TajoInternalError;
@@ -32,6 +34,8 @@ import java.sql.Statement;
 
 public class DerbyStore extends AbstractDBStore {
 
+  private static final Log LOG = LogFactory.getLog(DerbyStore.class);
+
   private static final String CATALOG_DRIVER="org.apache.derby.jdbc.EmbeddedDriver";
 
   protected String getCatalogDriverName(){
@@ -51,8 +55,7 @@ public class DerbyStore extends AbstractDBStore {
     return super.readSchemaFile("derby/" + filename);
   }
 
-  @Override
-  public final void close() {
+  public static void shutdown() {
     Connection conn = null;
     // shutdown embedded database.
     try {
@@ -64,12 +67,12 @@ public class DerbyStore extends AbstractDBStore {
         // tajo got the expected exception
         LOG.info("Derby shutdown complete normally.");
       } else {
-        LOG.info("Derby shutdown complete abnormally. - message:" + se.getMessage());
+        LOG.info("Derby shutdown complete abnormally. - message: " + se.getMessage());
       }
     } finally {
       CatalogUtil.closeQuietly(conn);
     }
-    LOG.info("Shutdown database (" + catalogUri + ")");
+    LOG.info("Shutdown database");
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java
deleted file mode 100644
index 7227366..0000000
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/MemStore.java
+++ /dev/null
@@ -1,785 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * 
- */
-package org.apache.tajo.catalog.store;
-
-import com.google.common.collect.Maps;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.Path;
-import org.apache.tajo.TajoConstants;
-import org.apache.tajo.catalog.*;
-import org.apache.tajo.catalog.proto.CatalogProtos;
-import org.apache.tajo.catalog.proto.CatalogProtos.*;
-import org.apache.tajo.exception.*;
-import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.KeyValueProto;
-import org.apache.tajo.util.KeyValueSet;
-import org.apache.tajo.util.TUtil;
-
-import java.io.IOException;
-import java.util.*;
-
-import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto.AlterTablespaceType;
-
-/**
- * CatalogServer guarantees that all operations are thread-safe.
- * So, we don't need to consider concurrency problem here.
- */
-public class MemStore implements CatalogStore {
-  private final Map<String, String> tablespaces = Maps.newHashMap();
-  private final Map<String, Map<String, CatalogProtos.TableDescProto>> databases = Maps.newHashMap();
-  private final Map<String, CatalogProtos.FunctionDescProto> functions = Maps.newHashMap();
-  private final Map<String, Map<String, IndexDescProto>> indexes = Maps.newHashMap();
-  private final Map<String, Map<String, IndexDescProto>> indexesByColumn = Maps.newHashMap();
-  private final Map<String, Map<String, CatalogProtos.PartitionDescProto>> partitions = Maps.newHashMap();
-
-  public MemStore(Configuration conf) {
-  }
-  
-  public void close() throws IOException {
-    databases.clear();
-    functions.clear();
-    indexes.clear();
-    partitions.clear();
-  }
-
-  @Override
-  public void createTablespace(String spaceName, String spaceUri) throws DuplicateTablespaceException {
-    if (tablespaces.containsKey(spaceName)) {
-      throw new DuplicateTablespaceException(spaceName);
-    }
-
-    tablespaces.put(spaceName, spaceUri);
-  }
-
-  @Override
-  public boolean existTablespace(String spaceName) {
-    return tablespaces.containsKey(spaceName);
-  }
-
-  @Override
-  public void dropTablespace(String spaceName) throws UndefinedTablespaceException {
-    if (!tablespaces.containsKey(spaceName)) {
-      throw new UndefinedTablespaceException(spaceName);
-    }
-    tablespaces.remove(spaceName);
-  }
-
-  @Override
-  public Collection<String> getAllTablespaceNames() {
-    return tablespaces.keySet();
-  }
-  
-  @Override
-  public List<TablespaceProto> getTablespaces() {
-    List<TablespaceProto> tablespaceList = TUtil.newList();
-    int tablespaceId = 0;
-    
-    for (String spaceName: tablespaces.keySet()) {
-      TablespaceProto.Builder builder = TablespaceProto.newBuilder();
-      builder.setSpaceName(spaceName);
-      builder.setUri(tablespaces.get(spaceName));
-      builder.setId(tablespaceId++);
-      tablespaceList.add(builder.build());
-    }
-    
-    return tablespaceList;
-  }
-
-  @Override
-  public TablespaceProto getTablespace(String spaceName) throws UndefinedTablespaceException {
-    if (!tablespaces.containsKey(spaceName)) {
-      throw new UndefinedTablespaceException(spaceName);
-    }
-
-    TablespaceProto.Builder builder = TablespaceProto.newBuilder();
-    builder.setSpaceName(spaceName);
-    builder.setUri(tablespaces.get(spaceName));
-    return builder.build();
-  }
-
-  @Override
-  public void alterTablespace(CatalogProtos.AlterTablespaceProto alterProto) throws UndefinedTablespaceException {
-    if (!tablespaces.containsKey(alterProto.getSpaceName())) {
-      throw new UndefinedTablespaceException(alterProto.getSpaceName());
-    }
-
-    if (alterProto.getCommandList().size() > 0) {
-      for (CatalogProtos.AlterTablespaceProto.AlterTablespaceCommand cmd : alterProto.getCommandList()) {
-        if(cmd.getType() == AlterTablespaceType.LOCATION) {
-          CatalogProtos.AlterTablespaceProto.SetLocation setLocation = cmd.getLocation();
-          tablespaces.put(alterProto.getSpaceName(), setLocation.getUri());
-        }
-      }
-    }
-  }
-
-  @Override
-  public void createDatabase(String databaseName, String tablespaceName) throws DuplicateDatabaseException {
-    if (databases.containsKey(databaseName)) {
-      throw new DuplicateDatabaseException(databaseName);
-    }
-
-    databases.put(databaseName, new HashMap<String, CatalogProtos.TableDescProto>());
-    indexes.put(databaseName, new HashMap<String, IndexDescProto>());
-    indexesByColumn.put(databaseName, new HashMap<String, IndexDescProto>());
-  }
-
-  @Override
-  public boolean existDatabase(String databaseName) {
-    return databases.containsKey(databaseName);
-  }
-
-  @Override
-  public void dropDatabase(String databaseName) throws UndefinedDatabaseException {
-    if (!databases.containsKey(databaseName)) {
-      throw new UndefinedDatabaseException(databaseName);
-    }
-    databases.remove(databaseName);
-    indexes.remove(databaseName);
-    indexesByColumn.remove(databaseName);
-  }
-
-  @Override
-  public Collection<String> getAllDatabaseNames() {
-    return databases.keySet();
-  }
-  
-  @Override
-  public List<DatabaseProto> getAllDatabases() {
-    List<DatabaseProto> databaseList = new ArrayList<DatabaseProto>();
-    int dbId = 0;
-    
-    for (String databaseName: databases.keySet()) {
-      DatabaseProto.Builder builder = DatabaseProto.newBuilder();
-      
-      builder.setId(dbId++);
-      builder.setName(databaseName);
-      builder.setSpaceId(0);
-      
-      databaseList.add(builder.build());
-    }
-    
-    return databaseList;
-  }
-
-  /**
-   * Get a database namespace from a Map instance.
-   */
-  private <T> Map<String, T> checkAndGetDatabaseNS(final Map<String, Map<String, T>> databaseMap,
-                                                   String databaseName) throws UndefinedDatabaseException {
-    if (databaseMap.containsKey(databaseName)) {
-      return databaseMap.get(databaseName);
-    } else {
-      throw new UndefinedDatabaseException(databaseName);
-    }
-  }
-
-  @Override
-  public void createTable(CatalogProtos.TableDescProto request)
-      throws UndefinedDatabaseException, DuplicateTableException {
-
-    String [] splitted = CatalogUtil.splitTableName(request.getTableName());
-    if (splitted.length == 1) {
-      throw new IllegalArgumentException("createTable() requires a qualified table name, but it is \""
-          + request.getTableName() + "\".");
-    }
-    String databaseName = splitted[0];
-    String tableName = splitted[1];
-
-    Map<String, CatalogProtos.TableDescProto> database = checkAndGetDatabaseNS(databases, databaseName);
-
-    String tbName = tableName;
-    if (database.containsKey(tbName)) {
-      throw new DuplicateTableException(tbName);
-    }
-    database.put(tbName, request);
-  }
-
-  @Override
-  public void updateTableStats(CatalogProtos.UpdateTableStatsProto request) throws UndefinedDatabaseException {
-    String [] splitted = CatalogUtil.splitTableName(request.getTableName());
-    if (splitted.length == 1) {
-      throw new IllegalArgumentException("createTable() requires a qualified table name, but it is \""
-        + request.getTableName() + "\".");
-    }
-    String databaseName = splitted[0];
-    String tableName = splitted[1];
-
-    final Map<String, CatalogProtos.TableDescProto> database = checkAndGetDatabaseNS(databases, databaseName);
-    final CatalogProtos.TableDescProto tableDescProto = database.get(tableName);
-    CatalogProtos.TableDescProto newTableDescProto = tableDescProto.toBuilder().setStats(request
-      .getStats().toBuilder()).build();
-    database.put(tableName, newTableDescProto);
-  }
-
-  @Override
-  public boolean existTable(String dbName, String tbName) throws UndefinedDatabaseException {
-    Map<String, CatalogProtos.TableDescProto> database = checkAndGetDatabaseNS(databases, dbName);
-
-    return database.containsKey(tbName);
-  }
-
-  @Override
-  public void dropTable(String dbName, String tbName) throws UndefinedDatabaseException, UndefinedTableException {
-    Map<String, CatalogProtos.TableDescProto> database = checkAndGetDatabaseNS(databases, dbName);
-
-    if (database.containsKey(tbName)) {
-      database.remove(tbName);
-    } else {
-      throw new UndefinedTableException(tbName);
-    }
-  }
-
-  /* (non-Javadoc)
-   * @see CatalogStore#alterTable(AlterTableDesc)
-   */
-  @Override
-  public void alterTable(CatalogProtos.AlterTableDescProto alterTableDescProto)
-      throws UndefinedDatabaseException, DuplicateTableException, DuplicatePartitionException, UndefinedPartitionException {
-
-    String[] split = CatalogUtil.splitTableName(alterTableDescProto.getTableName());
-    if (split.length == 1) {
-      throw new IllegalArgumentException("alterTable() requires a qualified table name, but it is \""
-          + alterTableDescProto.getTableName() + "\".");
-    }
-    String databaseName = split[0];
-    String tableName = split[1];
-
-    final Map<String, CatalogProtos.TableDescProto> database = checkAndGetDatabaseNS(databases, databaseName);
-
-    final CatalogProtos.TableDescProto tableDescProto = database.get(tableName);
-    CatalogProtos.TableDescProto newTableDescProto;
-    CatalogProtos.SchemaProto schemaProto;
-    String partitionName = null;
-    CatalogProtos.PartitionDescProto partitionDesc = null;
-
-    switch (alterTableDescProto.getAlterTableType()) {
-      case RENAME_TABLE:
-        if (database.containsKey(alterTableDescProto.getNewTableName())) {
-          throw new DuplicateTableException(alterTableDescProto.getNewTableName());
-        }
-        // Currently, we only use the default table space (i.e., WAREHOUSE directory).
-        String spaceUri = tablespaces.get(TajoConstants.DEFAULT_TABLESPACE_NAME);
-        // Create a new table directory.
-        String newPath = new Path(spaceUri, new Path(databaseName, alterTableDescProto.getNewTableName())).toString();
-        newTableDescProto = tableDescProto.toBuilder()
-            .setTableName(alterTableDescProto.getNewTableName())
-            .setPath(newPath).build();
-        database.remove(tableName);
-        database.put(alterTableDescProto.getNewTableName(), newTableDescProto);
-        break;
-      case RENAME_COLUMN:
-        schemaProto = tableDescProto.getSchema();
-        final int index = getIndexOfColumnToBeRenamed(schemaProto.getFieldsList(),
-            alterTableDescProto.getAlterColumnName().getOldColumnName());
-        final CatalogProtos.ColumnProto columnProto = schemaProto.getFields(index);
-        final CatalogProtos.ColumnProto newcolumnProto =
-            columnProto.toBuilder().setName(alterTableDescProto.getAlterColumnName().getNewColumnName()).build();
-        newTableDescProto = tableDescProto.toBuilder().setSchema(schemaProto.toBuilder().
-            setFields(index, newcolumnProto).build()).build();
-        database.put(tableName, newTableDescProto);
-        break;
-      case ADD_COLUMN:
-        schemaProto = tableDescProto.getSchema();
-        CatalogProtos.SchemaProto newSchemaProto =
-            schemaProto.toBuilder().addFields(alterTableDescProto.getAddColumn()).build();
-        newTableDescProto = tableDescProto.toBuilder().setSchema(newSchemaProto).build();
-        database.put(tableName, newTableDescProto);
-        break;
-      case ADD_PARTITION:
-        partitionDesc = alterTableDescProto.getPartitionDesc();
-        partitionName = partitionDesc.getPartitionName();
-
-        if (partitions.containsKey(tableName) && partitions.get(tableName).containsKey(partitionName)) {
-          throw new DuplicatePartitionException(partitionName);
-        } else {
-          addPartition(partitionDesc, tableName, partitionName);
-        }
-        break;
-      case DROP_PARTITION:
-        partitionDesc = alterTableDescProto.getPartitionDesc();
-        partitionName = partitionDesc.getPartitionName();
-        dropPartition(databaseName, tableName, partitionName);
-        break;
-      case SET_PROPERTY:
-        KeyValueSet properties = new KeyValueSet(tableDescProto.getMeta().getParams());
-        KeyValueSet newProperties = new KeyValueSet(alterTableDescProto.getParams());
-
-        for (String key : newProperties.getAllKeyValus().keySet()) {
-          if (properties.containsKey(key))
-            properties.remove(key);
-          properties.set(key, newProperties.get(key));
-        }
-
-        TableMeta newMeta = new TableMeta(tableDescProto.getMeta().getStoreType(), properties);
-        newTableDescProto = tableDescProto.toBuilder().setMeta(newMeta.getProto()).build();
-        database.put(tableName, newTableDescProto);
-        break;
-      default:
-    }
-  }
-
-  private void addPartition(CatalogProtos.PartitionDescProto partitionDesc, String tableName, String partitionName) {
-    CatalogProtos.PartitionDescProto.Builder builder = CatalogProtos.PartitionDescProto.newBuilder();
-    builder.setPartitionName(partitionName);
-    builder.setPath(partitionDesc.getPath());
-
-    if (partitionDesc.getPartitionKeysCount() > 0) {
-      for (CatalogProtos.PartitionKeyProto eachKey : partitionDesc.getPartitionKeysList()) {
-        CatalogProtos.PartitionKeyProto.Builder keyBuilder = CatalogProtos.PartitionKeyProto.newBuilder();
-        keyBuilder.setColumnName(eachKey.getColumnName());
-        keyBuilder.setPartitionValue(eachKey.getPartitionValue());
-        builder.addPartitionKeys(keyBuilder.build());
-      }
-    }
-
-    Map<String, CatalogProtos.PartitionDescProto> protoMap = null;
-    if (!partitions.containsKey(tableName)) {
-      protoMap = Maps.newHashMap();
-    } else {
-      protoMap = partitions.get(tableName);
-    }
-    protoMap.put(partitionName, builder.build());
-    partitions.put(tableName, protoMap);
-  }
-
-  private void dropPartition(String databaseName, String tableName, String partitionName)
-      throws UndefinedPartitionException {
-    if(!partitions.containsKey(tableName)) {
-      throw new UndefinedPartitionException(partitionName);
-    } else {
-      partitions.get(tableName).remove(partitionName);
-    }
-  }
-
-  private int getIndexOfColumnToBeRenamed(List<CatalogProtos.ColumnProto> fieldList, String columnName) {
-    int fieldCount = fieldList.size();
-    for (int index = 0; index < fieldCount; index++) {
-      CatalogProtos.ColumnProto columnProto = fieldList.get(index);
-      if (null != columnProto && columnProto.getName().equalsIgnoreCase(columnName)) {
-        return index;
-      }
-    }
-    return -1;
-  }
-  /* (non-Javadoc)
-   * @see CatalogStore#getTable(java.lang.String)
-   */
-  @Override
-  public CatalogProtos.TableDescProto getTable(String databaseName, String tableName)
-      throws UndefinedDatabaseException, UndefinedTableException {
-
-    Map<String, CatalogProtos.TableDescProto> database = checkAndGetDatabaseNS(databases, databaseName);
-
-    if (database.containsKey(tableName)) {
-      CatalogProtos.TableDescProto unqualified = database.get(tableName);
-      CatalogProtos.TableDescProto.Builder builder = CatalogProtos.TableDescProto.newBuilder();
-      CatalogProtos.SchemaProto schemaProto =
-          CatalogUtil.getQualfiedSchema(databaseName + "." + tableName, unqualified.getSchema());
-      builder.mergeFrom(unqualified);
-      builder.setSchema(schemaProto);
-      return builder.build();
-    } else {
-      throw new UndefinedTableException(tableName);
-    }
-  }
-
-  /* (non-Javadoc)
-   * @see CatalogStore#getAllTableNames()
-   */
-  @Override
-  public List<String> getAllTableNames(String databaseName) throws UndefinedDatabaseException {
-    Map<String, CatalogProtos.TableDescProto> database = checkAndGetDatabaseNS(databases, databaseName);
-    return new ArrayList<String>(database.keySet());
-  }
-  
-  @Override
-  public List<TableDescriptorProto> getAllTables() {
-    List<TableDescriptorProto> tableList = new ArrayList<CatalogProtos.TableDescriptorProto>();
-    int dbId = 0, tableId = 0;
-    
-    for (String databaseName: databases.keySet()) {
-      Map<String, TableDescProto> tables = databases.get(databaseName);
-      List<String> tableNameList = TUtil.newList(tables.keySet());
-      Collections.sort(tableNameList);
-      
-      for (String tableName: tableNameList) {
-        TableDescProto tableDesc = tables.get(tableName);
-        TableDescriptorProto.Builder builder = TableDescriptorProto.newBuilder();
-        
-        builder.setDbId(dbId);
-        builder.setTid(tableId);
-        builder.setName(tableName);
-        builder.setPath(tableDesc.getPath());
-        builder.setTableType(tableDesc.getIsExternal()?"EXTERNAL":"BASE");
-        builder.setStoreType(tableDesc.getMeta().getStoreType());
-        
-        tableList.add(builder.build());
-        tableId++;
-      }
-      dbId++;
-    }
-    
-    return tableList;
-  }
-  
-  @Override
-  public List<TableOptionProto> getAllTableProperties() {
-    List<TableOptionProto> optionList = new ArrayList<CatalogProtos.TableOptionProto>();
-    int tid = 0;
-    
-    for (String databaseName: databases.keySet()) {
-      Map<String, TableDescProto> tables = databases.get(databaseName);
-      List<String> tableNameList = TUtil.newList(tables.keySet());
-      Collections.sort(tableNameList);
-      
-      for (String tableName: tableNameList) {
-        TableDescProto table = tables.get(tableName); 
-        List<KeyValueProto> keyValueList = table.getMeta().getParams().getKeyvalList();
-        
-        for (KeyValueProto keyValue: keyValueList) {
-          TableOptionProto.Builder builder = TableOptionProto.newBuilder();
-          
-          builder.setTid(tid);
-          builder.setKeyval(keyValue);
-          
-          optionList.add(builder.build());
-        }
-      }
-      tid++;
-    }
-    
-    return optionList;
-  }
-  
-  @Override
-  public List<TableStatsProto> getAllTableStats() {
-    List<TableStatsProto> statList = new ArrayList<CatalogProtos.TableStatsProto>();
-    int tid = 0;
-    
-    for (String databaseName: databases.keySet()) {
-      Map<String, TableDescProto> tables = databases.get(databaseName);
-      List<String> tableNameList = TUtil.newList(tables.keySet());
-      Collections.sort(tableNameList);
-      
-      for (String tableName: tableNameList) {
-        TableDescProto table = tables.get(tableName);
-        TableStatsProto.Builder builder = TableStatsProto.newBuilder();
-        
-        builder.setTid(tid);
-        builder.setNumRows(table.getStats().getNumRows());
-        builder.setNumBytes(table.getStats().getNumBytes());
-        
-        statList.add(builder.build());
-      }
-      tid++;
-    }
-    
-    return statList;
-  }
-  
-  @Override
-  public List<ColumnProto> getAllColumns() {
-    List<ColumnProto> columnList = new ArrayList<CatalogProtos.ColumnProto>();
-    int tid = 0;
-    
-    for (String databaseName: databases.keySet()) {
-      Map<String, TableDescProto> tables = databases.get(databaseName);
-      List<String> tableNameList = TUtil.newList(tables.keySet());
-      Collections.sort(tableNameList);
-      
-      for (String tableName: tableNameList) {
-        TableDescProto tableDesc = tables.get(tableName);
-        
-        for (ColumnProto column: tableDesc.getSchema().getFieldsList()) {
-          ColumnProto.Builder builder = ColumnProto.newBuilder();
-          builder.setTid(tid);
-          builder.setName(column.getName());
-          builder.setDataType(column.getDataType());
-          columnList.add(builder.build());
-        }
-      }
-      tid++;
-    }
-    
-    return columnList;
-  }
-
-  @Override
-  public CatalogProtos.PartitionMethodProto getPartitionMethod(String databaseName, String tableName)
-      throws UndefinedDatabaseException, UndefinedTableException {
-
-    Map<String, CatalogProtos.TableDescProto> database = checkAndGetDatabaseNS(databases, databaseName);
-
-    if (database.containsKey(tableName)) {
-      CatalogProtos.TableDescProto table = database.get(tableName);
-      return table.hasPartition() ? table.getPartition() : null;
-    } else {
-      throw new UndefinedTableException(tableName);
-    }
-  }
-
-  @Override
-  public boolean existPartitionMethod(String databaseName, String tableName)
-      throws UndefinedDatabaseException, UndefinedTableException {
-
-    Map<String, CatalogProtos.TableDescProto> database = checkAndGetDatabaseNS(databases, databaseName);
-
-    if (database.containsKey(tableName)) {
-      CatalogProtos.TableDescProto table = database.get(tableName);
-      return table.hasPartition();
-    } else {
-      throw new UndefinedTableException(tableName);
-    }
-  }
-
-  @Override
-  public List<CatalogProtos.PartitionDescProto> getPartitions(String databaseName, String tableName) {
-    List<CatalogProtos.PartitionDescProto> protos = new ArrayList<CatalogProtos.PartitionDescProto>();
-
-    if (partitions.containsKey(tableName)) {
-      for (CatalogProtos.PartitionDescProto proto : partitions.get(tableName).values()) {
-        protos.add(proto);
-      }
-    }
-    return protos;
-  }
-
-  @Override
-  public CatalogProtos.PartitionDescProto getPartition(String databaseName, String tableName,
-                                                       String partitionName) throws UndefinedPartitionException {
-    if (partitions.containsKey(tableName) && partitions.get(tableName).containsKey(partitionName)) {
-      return partitions.get(tableName).get(partitionName);
-    } else {
-      throw new UndefinedPartitionException(partitionName);
-    }
-  }
-
-  public List<TablePartitionProto> getAllPartitions() {
-    List<TablePartitionProto> protos = new ArrayList<TablePartitionProto>();
-    Set<String> tables = partitions.keySet();
-    for (String table : tables) {
-      Map<String, CatalogProtos.PartitionDescProto> entryMap = partitions.get(table);
-      for (Map.Entry<String, CatalogProtos.PartitionDescProto> proto : entryMap.entrySet()) {
-        CatalogProtos.PartitionDescProto partitionDescProto = proto.getValue();
-
-        TablePartitionProto.Builder builder = TablePartitionProto.newBuilder();
-
-        builder.setPartitionName(partitionDescProto.getPartitionName());
-        builder.setPath(partitionDescProto.getPath());
-
-        // PARTITION_ID and TID is always necessary variables. In other CatalogStore excepting MemStore,
-        // all partitions would have PARTITION_ID and TID. But MemStore doesn't contain these variable values because
-        // it is implemented for test purpose. Thus, we need to set each variables to 0.
-        builder.setPartitionId(0);
-        builder.setTid(0);
-
-        protos.add(builder.build());
-      }
-    }
-    return protos;
-  }
-
-  @Override
-  public void addPartitions(String databaseName, String tableName, List<CatalogProtos.PartitionDescProto> partitions,
-    boolean ifNotExists) throws DuplicatePartitionException {
-
-    for(CatalogProtos.PartitionDescProto partition: partitions) {
-      String partitionName = partition.getPartitionName();
-
-      if (this.partitions.containsKey(tableName) && this.partitions.get(tableName).containsKey(partitionName)) {
-        if (ifNotExists) {
-          try {
-            dropPartition(databaseName, tableName, partitionName);
-          } catch (UndefinedPartitionException e) {
-            // ignore
-          }
-        } else {
-          throw new DuplicatePartitionException(partitionName);
-        }
-      }
-      addPartition(partition, tableName, partitionName);
-    }
-  }
-
-  /* (non-Javadoc)
-   * @see CatalogStore#createIndex(nta.catalog.proto.CatalogProtos.IndexDescProto)
-   */
-  @Override
-  public void createIndex(IndexDescProto proto) throws UndefinedDatabaseException, UndefinedTableException,
-      DuplicateIndexException {
-
-    final String databaseName = proto.getTableIdentifier().getDatabaseName();
-    final String tableName = CatalogUtil.extractSimpleName(proto.getTableIdentifier().getTableName());
-    getTable(databaseName, tableName);
-    Map<String, IndexDescProto> index = checkAndGetDatabaseNS(indexes, databaseName);
-    Map<String, IndexDescProto> indexByColumn = checkAndGetDatabaseNS(indexesByColumn, databaseName);
-
-    if (index.containsKey(proto.getIndexName())) {
-      throw new DuplicateIndexException(proto.getIndexName());
-    }
-
-    index.put(proto.getIndexName(), proto);
-    String originalTableName = proto.getTableIdentifier().getTableName();
-    String simpleTableName = CatalogUtil.extractSimpleName(originalTableName);
-    indexByColumn.put(CatalogUtil.buildFQName(proto.getTableIdentifier().getDatabaseName(),
-            simpleTableName,
-            getUnifiedNameForIndexByColumn(proto)),
-        proto);
-  }
-
-  /* (non-Javadoc)
-   * @see CatalogStore#dropIndex(java.lang.String)
-   */
-  @Override
-  public void dropIndex(String databaseName, String indexName) throws UndefinedDatabaseException,
-      UndefinedIndexException, UndefinedTableException {
-
-    Map<String, IndexDescProto> index = checkAndGetDatabaseNS(indexes, databaseName);
-    Map<String, IndexDescProto> indexByColumn = checkAndGetDatabaseNS(indexesByColumn, databaseName);
-    if (!index.containsKey(indexName)) {
-      throw new UndefinedIndexException(indexName);
-    }
-    IndexDescProto proto = index.get(indexName);
-    final String tableName = CatalogUtil.extractSimpleName(proto.getTableIdentifier().getTableName());
-    getTable(databaseName, tableName);
-    index.remove(indexName);
-    String originalTableName = proto.getTableIdentifier().getTableName();
-    String simpleTableName = CatalogUtil.extractSimpleName(originalTableName);
-    indexByColumn.remove(CatalogUtil.buildFQName(proto.getTableIdentifier().getDatabaseName(),
-        simpleTableName,
-        getUnifiedNameForIndexByColumn(proto)));
-  }
-
-  /* (non-Javadoc)
-   * @see CatalogStore#getIndexByName(java.lang.String)
-   */
-  @Override
-  public IndexDescProto getIndexByName(String databaseName, String indexName)
-      throws UndefinedDatabaseException, UndefinedIndexException {
-
-    Map<String, IndexDescProto> index = checkAndGetDatabaseNS(indexes, databaseName);
-    if (!index.containsKey(indexName)) {
-      throw new UndefinedIndexException(indexName);
-    }
-
-    return index.get(indexName);
-  }
-
-  @Override
-  public IndexDescProto getIndexByColumns(String databaseName, String tableName, String[] columnNames)
-      throws UndefinedDatabaseException, UndefinedTableException, UndefinedIndexException {
-
-    Map<String, IndexDescProto> indexByColumn = checkAndGetDatabaseNS(indexesByColumn, databaseName);
-    String simpleTableName = CatalogUtil.extractSimpleName(tableName);
-    TableDescProto tableDescProto = getTable(databaseName, simpleTableName);
-    String qualifiedColumnName = CatalogUtil.buildFQName(databaseName, simpleTableName,
-        CatalogUtil.getUnifiedSimpleColumnName(new Schema(tableDescProto.getSchema()), columnNames));
-    if (!indexByColumn.containsKey(qualifiedColumnName)) {
-      throw new UndefinedIndexException(qualifiedColumnName);
-    }
-
-    return indexByColumn.get(qualifiedColumnName);
-  }
-
-  @Override
-  public boolean existIndexByName(String databaseName, String indexName) throws UndefinedDatabaseException {
-    Map<String, IndexDescProto> index = checkAndGetDatabaseNS(indexes, databaseName);
-    return index.containsKey(indexName);
-  }
-
-  @Override
-  public boolean existIndexByColumns(String databaseName, String tableName, String[] columnNames)
-      throws UndefinedDatabaseException, UndefinedTableException {
-
-    Map<String, IndexDescProto> indexByColumn = checkAndGetDatabaseNS(indexesByColumn, databaseName);
-    TableDescProto tableDescProto = getTable(databaseName, tableName);
-    return indexByColumn.containsKey(
-        CatalogUtil.buildFQName(databaseName, CatalogUtil.extractSimpleName(tableName),
-            CatalogUtil.getUnifiedSimpleColumnName(new Schema(tableDescProto.getSchema()), columnNames)));
-  }
-
-  @Override
-  public List<String> getAllIndexNamesByTable(String databaseName, String tableName) throws UndefinedDatabaseException {
-    List<String> indexNames = new ArrayList<String>();
-    Map<String, IndexDescProto> indexByColumn = checkAndGetDatabaseNS(indexesByColumn, databaseName);
-    String simpleTableName = CatalogUtil.extractSimpleName(tableName);
-    for (IndexDescProto proto : indexByColumn.values()) {
-      if (proto.getTableIdentifier().getTableName().equals(simpleTableName)) {
-        indexNames.add(proto.getIndexName());
-      }
-    }
-
-    return indexNames;
-  }
-
-  @Override
-  public boolean existIndexesByTable(String databaseName, String tableName) throws UndefinedDatabaseException {
-    Map<String, IndexDescProto> indexByColumn = checkAndGetDatabaseNS(indexesByColumn, databaseName);
-    String simpleTableName = CatalogUtil.extractSimpleName(tableName);
-    for (IndexDescProto proto : indexByColumn.values()) {
-      if (proto.getTableIdentifier().getTableName().equals(simpleTableName)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @Override
-  public List<IndexDescProto> getAllIndexes() {
-    List<IndexDescProto> indexDescProtos = TUtil.newList();
-    for (Map<String,IndexDescProto> indexMap : indexes.values()) {
-      indexDescProtos.addAll(indexMap.values());
-    }
-    return indexDescProtos;
-  }
-
-  @Override
-  public void addFunction(FunctionDesc func) {
-    // to be implemented
-  }
-
-  @Override
-  public void deleteFunction(FunctionDesc func) {
-    // to be implemented
-  }
-
-  @Override
-  public void existFunction(FunctionDesc func) {
-    // to be implemented
-  }
-
-  @Override
-  public List<String> getAllFunctionNames() {
-    // to be implemented
-    return null;
-  }
-
-  public static String getUnifiedNameForIndexByColumn(IndexDescProto proto) {
-    StringBuilder sb = new StringBuilder();
-    for (SortSpecProto columnSpec : proto.getKeySortSpecsList()) {
-      String[] identifiers = columnSpec.getColumn().getName().split(CatalogConstants.IDENTIFIER_DELIMITER_REGEXP);
-      sb.append(identifiers[identifiers.length-1]).append("_");
-    }
-    sb.deleteCharAt(sb.length()-1);
-    return sb.toString();
-  }
-}

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/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
new file mode 100644
index 0000000..924c0bb
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/CatalogTestingUtil.java
@@ -0,0 +1,91 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tajo.catalog;
+
+import org.apache.tajo.annotation.NotNull;
+import org.apache.tajo.annotation.Nullable;
+import org.apache.tajo.catalog.store.*;
+import org.apache.tajo.conf.TajoConf;
+import org.apache.tajo.exception.UnsupportedCatalogStore;
+
+public class CatalogTestingUtil {
+
+  public static TajoConf configureCatalog(TajoConf conf, String testDirPath) throws UnsupportedCatalogStore {
+
+    String driverClassName = System.getProperty(CatalogConstants.STORE_CLASS);
+    final boolean useDefaultCatalog = driverClassName == null;
+
+    conf = initializeDerbyStore(conf, testDirPath);
+
+    // TODO: if useDefaultCatalog is false, use external database as catalog
+    return conf;
+  }
+
+  static <T extends CatalogStore> boolean requireAuth(Class<T> clazz) {
+    return clazz.equals(MySQLStore.class) ||
+        clazz.equals(MariaDBStore.class) ||
+        clazz.equals(PostgreSQLStore.class) ||
+        clazz.equals(OracleStore.class);
+  }
+
+  private static TajoConf initializeDerbyStore(TajoConf conf, String testDirPath) throws UnsupportedCatalogStore {
+    return configureCatalogClassAndUri(conf, DerbyStore.class, getInmemoryDerbyCatalogURI(testDirPath));
+  }
+
+  private static <T extends CatalogStore> TajoConf configureCatalogClassAndUri(TajoConf conf,
+                                                                               Class<T> catalogClass,
+                                                                               String catalogUri) {
+    conf.set(CatalogConstants.STORE_CLASS, catalogClass.getCanonicalName());
+    conf.set(CatalogConstants.CATALOG_URI, catalogUri);
+    return conf;
+  }
+
+  private static String getInmemoryDerbyCatalogURI(String testDirPath) throws UnsupportedCatalogStore {
+    return getCatalogURI(DerbyStore.class, "memory", testDirPath);
+  }
+
+  private static <T extends CatalogStore> String getCatalogURI(@NotNull Class<T> clazz,
+                                                               @Nullable String schemeSpecificPart,
+                                                               @NotNull String testDirPath)
+      throws UnsupportedCatalogStore {
+    String uriScheme = getCatalogURIScheme(clazz);
+    StringBuilder sb = new StringBuilder("jdbc:").append(uriScheme).append(":");
+    if (schemeSpecificPart != null) {
+      sb.append(schemeSpecificPart).append(":");
+    }
+    sb.append(testDirPath).append("/db;create=true");
+    return sb.toString();
+  }
+
+  private static <T extends CatalogStore> String getCatalogURIScheme(Class<T> clazz) throws UnsupportedCatalogStore {
+    if (clazz.equals(DerbyStore.class)) {
+      return "derby";
+    } else if (clazz.equals(MariaDBStore.class)) {
+      return "mariadb";
+    } else if (clazz.equals(MySQLStore.class)) {
+      return "mysql";
+    } else if (clazz.equals(OracleStore.class)) {
+      return "oracle";
+    } else if (clazz.equals(PostgreSQLStore.class)) {
+      return "postgresql";
+    } else {
+      throw new UnsupportedCatalogStore(clazz.getCanonicalName());
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/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 1d628f2..8eb5306 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
@@ -33,8 +33,8 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.exception.TajoException;
-import org.apache.tajo.exception.TajoInternalError;
 import org.apache.tajo.exception.UndefinedFunctionException;
+import org.apache.tajo.exception.UnsupportedCatalogStore;
 import org.apache.tajo.function.Function;
 import org.apache.tajo.util.CommonTestingUtil;
 import org.apache.tajo.util.KeyValueSet;
@@ -43,13 +43,13 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import java.io.File;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.*;
 
 import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME;
-import static org.apache.tajo.catalog.CatalogConstants.CATALOG_URI;
 import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto;
 import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto.AlterTablespaceType;
 import static org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto.SetLocation;
@@ -65,40 +65,17 @@ public class TestCatalog {
 	static CatalogServer server;
 	static CatalogService catalog;
 
-  public static TajoConf newTajoConfForCatalogTest() throws IOException {
-    final String HIVE_CATALOG_CLASS_NAME = "org.apache.tajo.catalog.store.HiveCatalogStore";
-
-    String driverClass = System.getProperty(CatalogConstants.STORE_CLASS);
-
-    // here, we don't choose HiveCatalogStore due to some dependency problems.
-    if (driverClass == null || driverClass.equals(HIVE_CATALOG_CLASS_NAME)) {
-      driverClass = DerbyStore.class.getCanonicalName();
-    }
-    String catalogURI = System.getProperty(CatalogConstants.CATALOG_URI);
-    if (catalogURI == null) {
-      Path path = CommonTestingUtil.getTestDir();
-      catalogURI = String.format("jdbc:derby:%s/db;create=true", path.toUri().getPath());
-    }
-    String connectionId = System.getProperty(CatalogConstants.CONNECTION_ID);
-    String password = System.getProperty(CatalogConstants.CONNECTION_PASSWORD);
-
-    TajoConf conf = new TajoConf();
-    conf.set(CatalogConstants.STORE_CLASS, driverClass);
-    conf.set(CATALOG_URI, catalogURI);
-    conf.setVar(TajoConf.ConfVars.CATALOG_ADDRESS, "127.0.0.1:0");
-
-    // MySQLStore/MariaDB/PostgreSQL requires username (and password).
-    if (isConnectionIdRequired(driverClass)) {
-      if (connectionId == null) {
-        throw new TajoInternalError(String.format("%s driver requires %s", driverClass, CatalogConstants.CONNECTION_ID));
-      }
-      conf.set(CatalogConstants.CONNECTION_ID, connectionId);
-      if (password != null) {
-        conf.set(CatalogConstants.CONNECTION_PASSWORD, password);
-      }
-    }
+  public static TajoConf newTajoConfForCatalogTest() throws IOException, UnsupportedCatalogStore {
+    return CatalogTestingUtil.configureCatalog(new TajoConf(), setupClusterTestBuildDir().getAbsolutePath());
+  }
 
-    return conf;
+  public static File setupClusterTestBuildDir() throws IOException {
+    String randomStr = UUID.randomUUID().toString();
+    String dirStr = CommonTestingUtil.getTestDir(randomStr).toString();
+    File dir = new File(dirStr).getAbsoluteFile();
+    // Have it cleaned up on exit
+    dir.deleteOnExit();
+    return dir;
   }
 
 	@BeforeClass
@@ -123,13 +100,6 @@ public class TestCatalog {
     }
 	}
 
-  public static boolean isConnectionIdRequired(String driverClass) {
-    return driverClass.equals(MySQLStore.class.getCanonicalName()) ||
-           driverClass.equals(MariaDBStore.class.getCanonicalName()) ||
-           driverClass.equals(PostgreSQLStore.class.getCanonicalName()) ||
-	   driverClass.equals(OracleStore.class.getCanonicalName());
-  }
-	
 	@AfterClass
 	public static void tearDown() throws IOException {
 	  server.stop();

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/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 d8f894e..b23a152 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
@@ -152,7 +152,8 @@ public class TestLinkedMetadataManager {
   static CatalogService catalog;
 
   @BeforeClass
-  public static void setUp() throws IOException, DuplicateTablespaceException, DuplicateDatabaseException {
+  public static void setUp() throws IOException, DuplicateTablespaceException, DuplicateDatabaseException,
+      UnsupportedCatalogStore {
     TajoConf conf = new TajoConf();
     conf.setVar(TajoConf.ConfVars.CATALOG_ADDRESS, "127.0.0.1:0");
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java b/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
index 105830f..7f33fdd 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
@@ -26,10 +26,11 @@ import org.apache.tajo.TajoIdProtos;
 import org.apache.tajo.annotation.NotNull;
 import org.apache.tajo.annotation.Nullable;
 import org.apache.tajo.auth.UserRoleInfo;
-import org.apache.tajo.exception.ExceptionUtil;
-import org.apache.tajo.exception.UndefinedDatabaseException;
 import org.apache.tajo.client.v2.exception.ClientConnectionException;
+import org.apache.tajo.exception.ExceptionUtil;
 import org.apache.tajo.exception.NoSuchSessionVariableException;
+import org.apache.tajo.exception.TajoRuntimeException;
+import org.apache.tajo.exception.UndefinedDatabaseException;
 import org.apache.tajo.ipc.ClientProtos;
 import org.apache.tajo.ipc.ClientProtos.SessionUpdateResponse;
 import org.apache.tajo.ipc.ClientProtos.UpdateSessionVariableRequest;
@@ -59,9 +60,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import static org.apache.tajo.error.Errors.ResultCode.NO_SUCH_SESSION_VARIABLE;
-import static org.apache.tajo.error.Errors.ResultCode.UNDEFINED_DATABASE;
 import static org.apache.tajo.exception.ReturnStateUtil.*;
-import static org.apache.tajo.exception.SQLExceptionUtil.toSQLException;
 import static org.apache.tajo.ipc.ClientProtos.CreateSessionRequest;
 import static org.apache.tajo.ipc.ClientProtos.CreateSessionResponse;
 
@@ -388,7 +387,7 @@ public class SessionConnection implements Closeable {
           LOG.debug(String.format("Got session %s as a user '%s'.", sessionId.getId(), userInfo.getUserName()));
         }
       } else {
-        throw new InvalidClientSessionException(sessionId.getId());
+        throw new TajoRuntimeException(response.getState());
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-cluster-tests/pom.xml
----------------------------------------------------------------------
diff --git a/tajo-cluster-tests/pom.xml b/tajo-cluster-tests/pom.xml
index 2816048..2958586 100644
--- a/tajo-cluster-tests/pom.xml
+++ b/tajo-cluster-tests/pom.xml
@@ -55,7 +55,6 @@
         </executions>
         <configuration>
           <excludes>
-            <exclude>derby.log</exclude>
             <exclude>benchmark/**</exclude>
             <exclude>src/test/resources/tpch/**</exclude>
           </excludes>
@@ -68,7 +67,7 @@
           <systemProperties>
             <tajo.test>TRUE</tajo.test>
           </systemProperties>
-          <argLine>-Xms512m -Xmx1024m -XX:MaxPermSize=152m -Dfile.encoding=UTF-8</argLine>
+          <argLine>-Xms512m -Xmx1024m -XX:MaxPermSize=152m -Dfile.encoding=UTF-8 -Dderby.storage.pageSize=1024 -Dderby.stream.error.file=/dev/null</argLine>
         </configuration>
       </plugin>
       <plugin>

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-cluster-tests/src/test/java/org/apache/tajo/CatalogTestingUtil.java
----------------------------------------------------------------------
diff --git a/tajo-cluster-tests/src/test/java/org/apache/tajo/CatalogTestingUtil.java b/tajo-cluster-tests/src/test/java/org/apache/tajo/CatalogTestingUtil.java
new file mode 100644
index 0000000..cbc409b
--- /dev/null
+++ b/tajo-cluster-tests/src/test/java/org/apache/tajo/CatalogTestingUtil.java
@@ -0,0 +1,92 @@
+/**
+ * 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;
+
+import org.apache.tajo.annotation.NotNull;
+import org.apache.tajo.annotation.Nullable;
+import org.apache.tajo.catalog.CatalogConstants;
+import org.apache.tajo.catalog.store.*;
+import org.apache.tajo.conf.TajoConf;
+import org.apache.tajo.exception.UnsupportedCatalogStore;
+
+public class CatalogTestingUtil {
+
+  public static TajoConf configureCatalog(TajoConf conf, String testDirPath) throws UnsupportedCatalogStore {
+
+    String driverClassName = System.getProperty(CatalogConstants.STORE_CLASS);
+    final boolean useDefaultCatalog = driverClassName == null;
+
+    conf = initializeDerbyStore(conf, testDirPath);
+
+    // TODO: if useDefaultCatalog is false, use external database as catalog
+    return conf;
+  }
+
+  static <T extends CatalogStore> boolean requireAuth(Class<T> clazz) {
+    return clazz.equals(MySQLStore.class) ||
+        clazz.equals(MariaDBStore.class) ||
+        clazz.equals(PostgreSQLStore.class) ||
+        clazz.equals(OracleStore.class);
+  }
+
+  private static TajoConf initializeDerbyStore(TajoConf conf, String testDirPath) throws UnsupportedCatalogStore {
+    return configureCatalogClassAndUri(conf, DerbyStore.class, getInmemoryDerbyCatalogURI(testDirPath));
+  }
+
+  private static <T extends CatalogStore> TajoConf configureCatalogClassAndUri(TajoConf conf,
+                                                                               Class<T> catalogClass,
+                                                                               String catalogUri) {
+    conf.set(CatalogConstants.STORE_CLASS, catalogClass.getCanonicalName());
+    conf.set(CatalogConstants.CATALOG_URI, catalogUri);
+    return conf;
+  }
+
+  private static String getInmemoryDerbyCatalogURI(String testDirPath) throws UnsupportedCatalogStore {
+    return getCatalogURI(DerbyStore.class, "memory", testDirPath);
+  }
+
+  private static <T extends CatalogStore> String getCatalogURI(@NotNull Class<T> clazz,
+                                                               @Nullable String schemeSpecificPart,
+                                                               @NotNull String testDirPath)
+      throws UnsupportedCatalogStore {
+    String uriScheme = getCatalogURIScheme(clazz);
+    StringBuilder sb = new StringBuilder("jdbc:").append(uriScheme).append(":");
+    if (schemeSpecificPart != null) {
+      sb.append(schemeSpecificPart).append(":");
+    }
+    sb.append(testDirPath).append("/db;create=true");
+    return sb.toString();
+  }
+
+  private static <T extends CatalogStore> String getCatalogURIScheme(Class<T> clazz) throws UnsupportedCatalogStore {
+    if (clazz.equals(DerbyStore.class)) {
+      return "derby";
+    } else if (clazz.equals(MariaDBStore.class)) {
+      return "mariadb";
+    } else if (clazz.equals(MySQLStore.class)) {
+      return "mysql";
+    } else if (clazz.equals(OracleStore.class)) {
+      return "oracle";
+    } else if (clazz.equals(PostgreSQLStore.class)) {
+      return "postgresql";
+    } else {
+      throw new UnsupportedCatalogStore(clazz.getCanonicalName());
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java
----------------------------------------------------------------------
diff --git a/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java b/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java
index 71ef0ea..ab1c156 100644
--- a/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java
+++ b/tajo-cluster-tests/src/test/java/org/apache/tajo/TajoTestingCluster.java
@@ -31,13 +31,17 @@ import org.apache.hadoop.hdfs.MiniDFSCluster;
 import org.apache.hadoop.util.ShutdownHookManager;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
+import org.apache.tajo.annotation.NotNull;
+import org.apache.tajo.annotation.Nullable;
 import org.apache.tajo.catalog.*;
+import org.apache.tajo.catalog.store.*;
 import org.apache.tajo.client.TajoClient;
 import org.apache.tajo.client.TajoClientImpl;
 import org.apache.tajo.client.TajoClientUtil;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.conf.TajoConf.ConfVars;
 import org.apache.tajo.engine.planner.global.rewriter.GlobalPlanTestRuleProvider;
+import org.apache.tajo.exception.UnsupportedCatalogStore;
 import org.apache.tajo.master.TajoMaster;
 import org.apache.tajo.plan.rewrite.LogicalPlanTestRuleProvider;
 import org.apache.tajo.querymaster.Query;
@@ -291,17 +295,11 @@ public class TajoTestingCluster {
   public MiniCatalogServer startCatalogCluster() throws Exception {
     if(isCatalogServerRunning) throw new IOException("Catalog Cluster already running");
 
-    TajoConf c = getConfiguration();
-
-    conf.set(CatalogConstants.STORE_CLASS, "org.apache.tajo.catalog.store.MemStore");
-    conf.set(CatalogConstants.CATALOG_URI, "jdbc:derby:" + clusterTestBuildDir.getAbsolutePath() + "/db");
+    CatalogTestingUtil.configureCatalog(conf, clusterTestBuildDir.getAbsolutePath());
     LOG.info("Apache Derby repository is set to " + conf.get(CatalogConstants.CATALOG_URI));
     conf.setVar(ConfVars.CATALOG_ADDRESS, "localhost:0");
 
     catalogServer = new MiniCatalogServer(conf);
-    CatalogServer catServer = catalogServer.getCatalogServer();
-    InetSocketAddress sockAddr = catServer.getBindAddress();
-    c.setVar(ConfVars.CATALOG_ADDRESS, NetUtils.normalizeInetSocketAddress(sockAddr));
     isCatalogServerRunning = true;
     return this.catalogServer;
   }
@@ -325,8 +323,8 @@ public class TajoTestingCluster {
   // Tajo Cluster Section
   ////////////////////////////////////////////////////////
   private void startMiniTajoCluster(File testBuildDir,
-                                               final int numSlaves,
-                                               boolean local) throws Exception {
+                                    final int numSlaves,
+                                    boolean local) throws Exception {
     TajoConf c = getConfiguration();
     c.setVar(ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS, "localhost:0");
     c.setVar(ConfVars.TAJO_MASTER_UMBILICAL_RPC_ADDRESS, "localhost:0");
@@ -335,8 +333,6 @@ public class TajoTestingCluster {
     c.setVar(ConfVars.WORKER_TEMPORAL_DIR, "file://" + testBuildDir.getAbsolutePath() + "/tajo-localdir");
     c.setIntVar(ConfVars.REST_SERVICE_PORT, 0);
 
-    LOG.info("derby repository is set to "+conf.get(CatalogConstants.CATALOG_URI));
-
     if (!local) {
       String tajoRootDir = getMiniDFSCluster().getFileSystem().getUri().toString() + "/tajo";
       c.setVar(ConfVars.ROOT_DIR, tajoRootDir);
@@ -353,6 +349,8 @@ public class TajoTestingCluster {
 
     setupCatalogForTesting(c, testBuildDir);
 
+    LOG.info("derby repository is set to " + conf.get(CatalogConstants.CATALOG_URI));
+
     tajoMaster = new TajoMaster();
     tajoMaster.init(c);
     tajoMaster.start();
@@ -386,7 +384,7 @@ public class TajoTestingCluster {
     LOG.info("====================================================================================");
   }
 
-  private void setupCatalogForTesting(TajoConf c, File testBuildDir) throws IOException {
+  private void setupCatalogForTesting(TajoConf c, File testBuildDir) throws IOException, UnsupportedCatalogStore {
     final String HIVE_CATALOG_CLASS_NAME = "org.apache.tajo.catalog.store.HiveCatalogStore";
     boolean hiveCatalogClassExists = false;
     try {
@@ -416,8 +414,7 @@ public class TajoTestingCluster {
         throw new IOException(cnfe);
       }
     } else { // for derby
-      c.set(CatalogConstants.STORE_CLASS, "org.apache.tajo.catalog.store.MemStore");
-      c.set(CatalogConstants.CATALOG_URI, "jdbc:derby:" + testBuildDir.getAbsolutePath() + "/db");
+      CatalogTestingUtil.configureCatalog(conf, testBuildDir.getAbsolutePath());
     }
     c.setVar(ConfVars.CATALOG_ADDRESS, "localhost:0");
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java b/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
index edae2d7..3b11eab 100644
--- a/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
@@ -96,6 +96,8 @@ public class ErrorMessages {
     ADD_MESSAGE(CAT_UPGRADE_REQUIRED, "catalog must be upgraded");
     ADD_MESSAGE(CAT_CANNOT_CONNECT, "cannot connect metadata store '%s': %s", 2);
 
+    ADD_MESSAGE(CAT_UNSUPPORTED_CATALOG_STORE, "unsupported catalog store: %s", 1);
+
     ADD_MESSAGE(LMD_NO_MATCHED_DATATYPE, "no matched type for %s", 1);
 
     // Storage and Data Format

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java b/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java
index 6e36f94..b06cb36 100644
--- a/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java
@@ -83,6 +83,8 @@ public class ExceptionUtil {
 
     ADD_EXCEPTION(TOO_LARGE_INPUT_FOR_CROSS_JOIN, TooLargeInputForCrossJoinException.class);
     ADD_EXCEPTION(INVALID_INPUTS_FOR_CROSS_JOIN, InvalidInputsForCrossJoin.class);
+
+    ADD_EXCEPTION(CAT_UNSUPPORTED_CATALOG_STORE, UnsupportedCatalogStore.class);
   }
 
   private static void ADD_EXCEPTION(Errors.ResultCode code, Class<? extends DefaultTajoException> cls) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/77dc88c0/tajo-common/src/main/java/org/apache/tajo/exception/UnsupportedCatalogStore.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/UnsupportedCatalogStore.java b/tajo-common/src/main/java/org/apache/tajo/exception/UnsupportedCatalogStore.java
new file mode 100644
index 0000000..de2ec83
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/UnsupportedCatalogStore.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.exception;
+
+import org.apache.tajo.error.Errors.ResultCode;
+import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.ReturnState;
+
+public class UnsupportedCatalogStore extends TajoException {
+
+  public UnsupportedCatalogStore(ReturnState e) {
+    super(e);
+  }
+
+  public UnsupportedCatalogStore(String name) {
+    super(ResultCode.CAT_UNSUPPORTED_CATALOG_STORE, name);
+  }
+}