http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-common/src/main/proto/errors.proto
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/proto/errors.proto 
b/tajo-common/src/main/proto/errors.proto
new file mode 100644
index 0000000..1ad9c85
--- /dev/null
+++ b/tajo-common/src/main/proto/errors.proto
@@ -0,0 +1,330 @@
+/**
+ * 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 tajo.error;
+option java_package = "org.apache.tajo.error";
+
+import "stacktrace.proto";
+
+// Unstable - this is still evolving.
+
+
+// SQLState Class values that begin with 0, 1, 2, 3, 4, A, B, C, D, E, F, G or 
H
+// are called "standard-defined classes". This is borrowed from PostgreSQL and 
IBM DB2.
+
+// 00 - Successful Completion
+// 01 - Warning
+// 02 - No Data
+// 07 - Dynamic SQL Error
+// 08 - Connection Exception
+// 09 - Triggered Action Exception
+// 0A - Feature Not Supported
+// 0D - Invalid Target Type Specification
+// 0F - Invalid Token
+// 0K - Invalid RESIGNAL Statement
+// 0N - SQL/XML mapping error
+// 20 - Case Not Found for CASE Statement
+// 21 - Cardinality Violation
+// 22 - Data Exception
+// 23 - Constraint Violation
+// 24 - Invalid Cursor State
+// 25 - Invalid Transaction State
+// 26 - Invalid SQL Statement Identifier
+// 28 - Invalid Authorization Specification
+// 2D - Invalid Transaction Termination
+// 2E - Invalid Connection Name
+// 34 - Invalid Cursor Name
+// 36 - Cursor Sensitivity Exception
+// 38 - External Function Exception
+// 39 - External Function Call Exception
+// 3B - Invalid SAVEPOINT
+// 40 - Transaction Rollback
+// 42 - Syntax Error or Access Rule Violation
+// 44 - WITH CHECK OPTION Violation
+// 46 - Java DDL
+// 51 - Invalid Application State
+// 53 - Invalid Operand or Inconsistent Specification
+// 54 - SQL or Product Limit Exceeded
+// 55 - Object Not in Prerequisite State
+// 56 - Miscellaneous SQL or Product Error
+// 57 - Resource Not Available or Operator Intervention
+// 58 - System Error
+
+enum ResultCode {
+  // Class
+  // 00 - Successful Completion
+  OK                            = 0;
+
+  WARNING                       = 100; // Warning
+
+  // General Errors
+  INTERNAL_ERROR                = 201; // Error caused by internal bugs (See 
also TajoInternalException.java)
+  NOT_IMPLEMENTED               = 202; // Planned, but not implemented yet.
+  FEATURE_NOT_SUPPORTED         = 203; // SQLState: 0A000 - Unsupported 
feature (usually for unreasonable feature)
+  INVALID_RPC_CALL              = 204; // When invalid RPC call is invoked 
(e.g., wrong message and absent fields)
+
+  // Query Management and Scheduler
+  NO_SUCH_QUERYID               = 301; // No query id in TajoMaster
+  NO_DATA                       = 302; // No data due to query fail or error
+  INCOMPLETE_QUERY              = 303; // It occurs when a client requests 
something of a completed query.
+
+  // Session
+  INVALID_SESSION               = 401; // Session already was invalid
+  NO_SUCH_SESSION_VARIABLE      = 402; // Session variable not found
+  INVALID_SESSION_VARIABLE      = 403; // Session variable is invalid (type 
mismatch or out of range)
+
+  // Data Exception (SQLState Class - 22)
+  DIVISION_BY_ZERO              = 451; // SQLState: 22012 - Division by zero
+
+
+  // Section: Class 42 - Syntax Error or Access Rule Violation
+  SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION = 501; // SQLState: 42000
+  SYNTAX_ERROR                          = 502; // SQLState: 42601
+  INSUFFICIENT_PRIVILEGE                = 503; // SQLState: 42501
+
+  UNDEFINED_TABLESPACE                  = 511; // ?
+  UNDEFINED_DATABASE                    = 512; // ?
+  UNDEFINED_SCHEMA                      = 513; // ?
+  UNDEFINED_TABLE                       = 514; // ?
+  UNDEFINED_COLUMN                      = 515; // SQLState: 42703
+  UNDEFINED_FUNCTION                    = 516; // SQLState: 42883
+  UNDEFINED_INDEX                       = 517; // ?
+  UNDEFINED_INDEX_NAME                  = 518; // ?
+  UNDEFINED_PARTITION                   = 519; // ?
+  UNDEFINED_PARTITION_METHOD            = 520; // ?
+  UNDEFINED_OPERATOR                    = 521; // SQLState: 42883 
(=UNDEFINED_FUNCTION)
+
+  DUPLICATE_TABLESPACE                  = 531;
+  DUPLICATE_DATABASE                    = 532; // SQLState: 42P04
+  DUPLICATE_SCHEMA                      = 533; // SQLState: 42P06
+  DUPLICATE_TABLE                       = 534; // SQLState: 42P07
+  DUPLICATE_COLUMN                      = 535; // SQLState: 42701
+  DUPLICATE_ALIAS                       = 536; // SQLState: 42712
+  DUPLICATE_FUNCTION                    = 537; // SQLState: 42723
+  DUPLICATE_INDEX                       = 538; // SQLState: ?
+  DUPLICATE_PARTITION                   = 539; // SQLState: ?
+
+  AMBIGUOUS_TABLE                       = 541; // ?
+  AMBIGUOUS_COLUMN                      = 542; // SQLState: 42702;
+  AMBIGUOUS_FUNCTION                    = 543; // SQLState: 42725;
+
+  CANNOT_CAST                           = 601; // SQLState: 42846 - Cast from 
source type to target type is not supported.
+  GROUPING_ERROR                        = 602; // SQLState: 42803
+  WINDOWING_ERROR                       = 603; // SQLState: 42P20 - PgSQL 
implementation-defined
+  INVALID_RECURSION                     = 604; // SQLState: 42P19 - PgSQL 
implementation-defined
+  SET_OPERATION_SCHEMA_MISMATCH         = 605; // SQLState: 42601 
(=SYNTAX_ERROR)
+  SET_OPERATION_DATATYPE_MISMATCH       = 606; // SQLState: 42601 
(=SYNTAX_ERROR)
+  INVALID_FOREIGN_KEY                   = 621; // SQLState: 42830
+  INVALID_NAME                          = 622; // SQLState: 42602
+  INVALID_COLUMN_DEFINITION             = 623; // SQLState: 42611
+  NAME_TOO_LONG                         = 624; // SQLState: 42622
+  RESERVED_NAME                         = 625; // SQLState: 42939
+  DATATYPE_MISMATCH                     = 626; // SQLState: 42804
+  INDETERMINATE_DATATYPE                = 627; // SQLState: 42P18 - PgSQL 
implementation -defined
+
+
+
+  // Expressions
+  INVALID_EXPRESSION                    = 701;
+  INVALID_CAST                          = 702;
+  INVALID_DATATYPE                      = 703;
+
+  NUMERIC_OVERFLOW                      = 803;  // Numeric value overflow
+  VALUE_LARGER_THAN_PRECISION           = 804;  // Value larger than column 
precision
+
+  // Meta Catalog
+  CAT_UPGRADE_REQUIRED                  = 901;  // Migration
+  CAT_CANNOT_CONNECT                    = 902;  // Cannot connect metadata 
server
+
+  // MetaData Connector (MDC)
+  MDC_NO_MATCHED_DATATYPE               = 910;  // No matched data type 
between Tajo and connector
+
+  // Storage and Data Format
+  UNKNOWN_DATAFORMAT                    = 1001; // Unknown Data Format
+
+
+  CLIENT_CONNECTION_EXCEPTION           = 1101; // SQLState: 08000 - Client 
connection error
+  CLIENT_UNABLE_TO_ESTABLISH_CONNECTION = 1102; // SQLState: 08001 -
+  CLIENT_PROTOCOL_PROTOCOL_VIOLATION    = 1103; // SQLState: ?
+
+  // 53 - Invalid Operand or Inconsistent Specification
+  INSUFFICIENT_RESOURCE         = 53000;
+  DISK_FULL                     = 53100;
+  OUT_OF_MEMORY                 = 53200;
+
+  // 54 - SQL or Product Limit Exceeded
+  PROGRAM_LIMIT_EXCEEDED        = 54000;
+  STATEMENT_TOO_COMPLEX         = 54001;
+  STRING_CONSTANT_TOOL_LONG     = 54002;
+
+  TOO_MANY_TABLES               = 54004;
+  TOO_MANY_COLUMNS              = 54011;
+  TOO_MANY_ARGUMENTS            = 54023;
+
+  // 55 - Object Not in Prerequisite State
+  // 56 - Miscellaneous SQL or Product Error
+  // 57 - Resource Not Available or Operator Intervention
+
+  // 58 - System Error
+  IO_ERROR                      = 58030;
+
+
+  // underlying system errors based on errno.h.
+  EPERM                         = 10001;  // Operation not permitted
+  ENOENT                        = 10002;  // No such file or directory
+  ESRCH                         = 10003;  // No such process
+  EINTR                         = 10004;  // Interrupted system call
+  EIO                           = 10005;  // I/O error
+  ENXIO                         = 10006;  // No such device or address
+  E2BIG                         = 10007;  // Argument list too long
+  ENOEXEC                       = 10008;  // Exec format error
+  EBADF                         = 10009;  // Bad file number
+  ECHILD                        = 10010;  // No child processes
+  EAGAIN                        = 10011;  // Try again
+  ENOMEM                        = 10012;  // Out of memory
+  EACCES                        = 10013;  // Permission denied
+  EFAULT                        = 10014;  // Bad address
+  ENOTBLK                       = 10015;  // Block device required
+  EBUSY                         = 10016;  // Device or resource busy
+  EEXIST                        = 10017;  // File exists
+  EXDEV                         = 10018;  // Cross-device link
+  ENODEV                        = 10019;  // No such device
+  ENOTDIR                       = 10020;  // Not a directory
+  EISDIR                        = 10021;  // Is a directory
+  EINVAL                        = 10022;  // Invalid argument
+  ENFILE                        = 10023;  // File table overflow
+  EMFILE                        = 10024;  // Too many open files
+  ENOTTY                        = 10025;  // Not a typewriter
+  ETXTBSY                       = 10026;  // Text file busy
+  EFBIG                         = 10027;  // File too large
+  ENOSPC                        = 10028;  // No space left on device
+  ESPIPE                        = 10029;  // Illegal seek
+  EROFS                         = 10030;  // Read-only file system
+  EMLINK                        = 10031;  // Too many links
+  EPIPE                         = 10032;  // Broken pipe
+  EDOM                          = 10033;  // Math argument out of domain of 
func
+  ERANGE                        = 10034;  // Math result not representable
+;
+  EDEADLK                       = 10035;  // Resource deadlock would occur
+  ENAMETOOLONG                  = 10036;  // File name too long
+  ENOLCK                        = 10037;  // No record locks available
+  ENOSYS                        = 10038;  // Function not implemented
+  ENOTEMPTY                     = 10039;  // Directory not empty
+  ELOOP                         = 10040;  // Too many symbolic links 
encountered
+  // EWOULDBLOCK                = EAGAIN  // Operation would block
+  ENOMSG                        = 10042;  // No message of desired type
+  EIDRM                         = 10043;  // Identifier removed
+  ECHRNG                        = 10044;  // Channel number out of range
+  EL2NSYNC                      = 10045;  // Level 2 not synchronized
+  EL3HLT                        = 10046;  // Level 3 halted
+  EL3RST                        = 10047;  // Level 3 reset
+  ELNRNG                        = 10048;  // Link number out of range
+  EUNATCH                       = 10049;  // Protocol driver not attached
+  ENOCSI                        = 10050;  // No CSI structure available
+  EL2HLT                        = 10051;  // Level 2 halted
+  EBADE                         = 10052;  // Invalid exchange
+  EBADR                         = 10053;  // Invalid request descriptor
+  EXFULL                        = 10054;  // Exchange full
+  ENOANO                        = 10055;  // No anode
+  EBADRQC                       = 10056;  // Invalid request code
+  EBADSLT                       = 10057;  // Invalid slot
+  // EDEADLOCK                  = EDEADLK
+  EBFONT                        = 10059;  // Bad font file format
+  ENOSTR                        = 10060;  // Device not a stream
+  ENODATA                       = 10061;  // No data available
+  ETIME                         = 10062;  // Timer expired
+  ENOSR                         = 10063;  // Out of streams resources
+  ENONET                        = 10064;  // Machine is not on the network
+  ENOPKG                        = 10065;  // Package not installed
+  EREMOTE                       = 10066;  // Object is remote
+  ENOLINK                       = 10067;  // Link has been severed
+  EADV                          = 10068;  // Advertise error
+  ESRMNT                        = 10069;  // Srmount error
+  ECOMM                         = 10070;  // Communication error on send
+  EPROTO                        = 10071;  // Protocol error
+  EMULTIHOP                     = 10072;  // Multihop attempted
+  EDOTDOT                       = 10073;  // RFS specific error
+  EBADMSG                       = 10074;  // Not a data message
+  EOVERFLOW                     = 10075;  // Value too large for defined data 
type
+  ENOTUNIQ                      = 10076;  // Name not unique on network
+  EBADFD                        = 10077;  // File descriptor in bad state
+  EREMCHG                       = 10078;  // Remote address changed
+  ELIBACC                       = 10079;  // Can not access a needed shared 
library
+  ELIBBAD                       = 10080;  // Accessing a corrupted shared 
library
+  ELIBSCN                       = 10081;  // .lib section in a.out corrupted
+  ELIBMAX                       = 10082;  // Attempting to link in too many 
shared libraries
+  ELIBEXEC                      = 10083;  // Cannot exec a shared library 
directly
+  EILSEQ                        = 10084;  // Illegal byte sequence
+  ERESTART                      = 10085;  // Interrupted system call should be 
restarted
+  ESTRPIPE                      = 10086;  // Streams pipe error
+  EUSERS                        = 10087;  // Too many users
+  ENOTSOCK                      = 10088;  // Socket operation on non-socket
+  EDESTADDRREQ                  = 10089;  // Destination address required
+  EMSGSIZE                      = 10090;  // Message too long
+  EPROTOTYPE                    = 10091;  // Protocol wrong type for socket
+  ENOPROTOOPT                   = 10092;  // Protocol not available
+  EPROTONOSUPPORT               = 10093;  // Protocol not supported
+  ESOCKTNOSUPPORT               = 10094;  // Socket type not supported
+  EOPNOTSUPP                    = 10095;  // Operation not supported on 
transport endpoint
+  EPFNOSUPPORT                  = 10096;  // Protocol family not supported
+  EAFNOSUPPORT                  = 10097;  // Address family not supported by 
protocol
+  EADDRINUSE                    = 10098;  // Address already in use
+  EADDRNOTAVAIL                 = 10099;  // Cannot assign requested address
+  ENETDOWN                      = 10100; // Network is down
+  ENETUNREACH                   = 10101; // Network is unreachable
+  ENETRESET                     = 10102; // Network dropped connection because 
of reset
+  ECONNABORTED                  = 10103; // Software caused connection abort
+  ECONNRESET                    = 10104; // Connection reset by peer
+  ENOBUFS                       = 10105; // No buffer space available
+  EISCONN                       = 10106; // Transport endpoint is already 
connected
+  ENOTCONN                      = 10107; // Transport endpoint is not connected
+  ESHUTDOWN                     = 10108; // Cannot send after transport 
endpoint shutdown
+  ETOOMANYREFS                  = 10109; // Too many references: cannot splice
+  ETIMEDOUT                     = 10110; // Connection timed out
+  ECONNREFUSED                  = 10111; // Connection refused
+  EHOSTDOWN                     = 10112; // Host is down
+  EHOSTUNREACH                  = 10113; // No route to host
+  EALREADY                      = 10114; // Operation already in progress
+  EINPROGRESS                   = 10115; // Operation now in progress
+  ESTALE                        = 10116; // Stale NFS file handle
+  EUCLEAN                       = 10117; // Structure needs cleaning
+  ENOTNAM                       = 10118; // Not a XENIX named type file
+  ENAVAIL                       = 10119; // No XENIX semaphores available
+  EISNAM                        = 10120; // Is a named type file
+  EREMOTEIO                     = 10121; // Remote I/O error
+  EDQUOT                        = 10122; // Quota exceeded
+  ENOMEDIUM                     = 10123; // No medium found
+  EMEDIUMTYPE                   = 10124; // Wrong medium type
+  ECANCELED                     = 10125; // Operation Canceled
+  ENOKEY                        = 10126; // Required key not available
+  EKEYEXPIRED                   = 10127; // Key has expired
+  EKEYREVOKED                   = 10128; // Key has been revoked
+  EKEYREJECTED                  = 10129; // Key was rejected by service
+
+  // for robust mutexes
+  EOWNERDEAD                    = 10130; // Owner died
+  ENOTRECOVERABLE               = 10131; // State not recoverable
+}
+
+message SerializedException {
+  required int64 timestamp         = 1;  // Microseconds since Epoch.
+  required ResultCode return_code  = 2;
+  required string message          = 3;
+
+  optional StackTrace stack_trace  = 4;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-common/src/main/proto/stacktrace.proto
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/proto/stacktrace.proto 
b/tajo-common/src/main/proto/stacktrace.proto
new file mode 100644
index 0000000..04dca13
--- /dev/null
+++ b/tajo-common/src/main/proto/stacktrace.proto
@@ -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.
+ */
+
+// Copyright 2011 Google Inc. All Rights Reserved.
+// Support for serializing stack traces.
+
+package tajo.error;
+option java_package = "org.apache.tajo.error";
+
+message StackTrace {
+  message Element {
+    optional string function   = 1;
+    optional string filename   = 2;
+    optional int32 line        = 3  [default = -1];
+    optional string context    = 4;
+  }
+  repeated Element element     = 1;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java
----------------------------------------------------------------------
diff --git 
a/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java 
b/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java
index 884ad8f..baac91c 100644
--- a/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java
+++ b/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java
@@ -19,7 +19,7 @@
 package org.apache.tajo.common.type;
 
 import org.junit.Test;
-import org.apache.tajo.common.exception.InvalidAddressException;
+import org.apache.tajo.exception.InvalidAddressException;
 
 import static org.junit.Assert.*;
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/benchmark/BenchmarkSet.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/benchmark/BenchmarkSet.java 
b/tajo-core/src/main/java/org/apache/tajo/benchmark/BenchmarkSet.java
index 6c02dc5..b4a28db 100644
--- a/tajo-core/src/main/java/org/apache/tajo/benchmark/BenchmarkSet.java
+++ b/tajo-core/src/main/java/org/apache/tajo/benchmark/BenchmarkSet.java
@@ -35,6 +35,7 @@ import org.apache.tajo.util.FileUtil;
 import java.io.File;
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.sql.SQLException;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -45,7 +46,7 @@ public abstract class BenchmarkSet {
   protected Map<String, String> queries = new HashMap<String, String>();
   protected String dataDir;
 
-  public void init(TajoConf conf, String dataDir) throws IOException {
+  public void init(TajoConf conf, String dataDir) throws SQLException {
     this.dataDir = dataDir;
 
     if (System.getProperty(ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS.varname) != 
null) {
@@ -90,7 +91,7 @@ public abstract class BenchmarkSet {
 
   public abstract void loadQueries() throws IOException;
 
-  public abstract void loadTables() throws ServiceException;
+  public abstract void loadTables() throws SQLException;
 
   public String [] getTableNames() {
     return schemas.keySet().toArray(new String[schemas.size()]);
@@ -112,7 +113,7 @@ public abstract class BenchmarkSet {
     return outSchemas.get(name);
   }
 
-  public void perform(String queryName) throws IOException, ServiceException {
+  public void perform(String queryName) throws SQLException {
     String query = getQuery(queryName);
     if (query == null) {
       throw new IllegalArgumentException("#{queryName} does not exists");

http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java 
b/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java
index 9994634..dd3a43b 100644
--- a/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java
+++ b/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java
@@ -192,7 +192,7 @@ public class TPCH extends BenchmarkSet {
     loadQueries(BENCHMARK_DIR);
   }
 
-  public void loadTables() throws ServiceException {
+  public void loadTables() throws SQLException {
     loadTable(LINEITEM);
     loadTable(CUSTOMER);
     loadTable(CUSTOMER_PARTS);
@@ -206,7 +206,7 @@ public class TPCH extends BenchmarkSet {
 
   }
 
-  public void loadTable(String tableName) throws ServiceException {
+  public void loadTable(String tableName) throws SQLException {
     TableMeta meta = CatalogUtil.newTableMeta("CSV");
     meta.putOption(StorageConstants.TEXT_DELIMITER, 
StorageConstants.DEFAULT_FIELD_DELIMITER);
 
@@ -221,12 +221,9 @@ public class TPCH extends BenchmarkSet {
           "c_nationkey",
           expressionSchema);
     }
-    try {
-      tajo.createExternalTable(tableName, getSchema(tableName),
-          new Path(dataDir, tableName).toUri(), meta, partitionMethodDesc);
-    } catch (SQLException s) {
-      throw new ServiceException(s);
-    }
+
+    tajo.createExternalTable(tableName, getSchema(tableName),
+        new Path(dataDir, tableName).toUri(), meta, partitionMethodDesc);
   }
 
   public static List<String> getDataFilePaths(String... tables) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java 
b/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
index 5c62654..e433e4f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
@@ -60,7 +60,6 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
       parser.addErrorListener(new SQLErrorListener());
       context = parser.sql();
     } catch (SQLParseError e) {
-      e.printStackTrace();
       throw new SQLSyntaxError(e);
     }
     return visitSql(context);

http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java 
b/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java
index 4c3b0fd..0b50d4b 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java
@@ -19,19 +19,22 @@
 package org.apache.tajo.engine.parser;
 
 
-import org.apache.tajo.plan.InvalidQueryException;
+import org.apache.tajo.error.Errors;
+import org.apache.tajo.exception.TajoRuntimeException;
+import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos;
+import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.ReturnState;
 
-public class SQLSyntaxError extends InvalidQueryException {
+public class SQLSyntaxError extends TajoRuntimeException {
   private static final long serialVersionUID = 5388279335175632067L;
 
   private transient String detailedMessage;
 
   public SQLSyntaxError(String errorMessage) {
-    super(errorMessage);
+    super(Errors.ResultCode.SYNTAX_ERROR, errorMessage);
   }
 
   public SQLSyntaxError(SQLParseError e) {
-    super(e.getMessageHeader(), e);
+    super(Errors.ResultCode.SYNTAX_ERROR, e.getMessageHeader());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java 
b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
index 37b497c..00d346a 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
@@ -26,7 +26,6 @@ import com.google.common.cache.Weigher;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.service.AbstractService;
-import org.apache.hadoop.util.StringUtils;
 import org.apache.tajo.QueryId;
 import org.apache.tajo.QueryIdFactory;
 import org.apache.tajo.SessionVars;
@@ -35,24 +34,22 @@ import org.apache.tajo.algebra.JsonHelper;
 import org.apache.tajo.catalog.CatalogService;
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.catalog.TableDesc;
+import org.apache.tajo.exception.ReturnStateUtil;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.engine.parser.SQLAnalyzer;
 import org.apache.tajo.engine.parser.SQLSyntaxError;
 import org.apache.tajo.engine.query.QueryContext;
-import org.apache.tajo.ipc.ClientProtos;
+import org.apache.tajo.exception.ExceptionUtil;
 import org.apache.tajo.master.TajoMaster.MasterContext;
 import org.apache.tajo.master.exec.DDLExecutor;
 import org.apache.tajo.master.exec.QueryExecutor;
-import org.apache.tajo.session.Session;
 import org.apache.tajo.plan.*;
 import org.apache.tajo.plan.logical.InsertNode;
 import org.apache.tajo.plan.logical.LogicalRootNode;
 import org.apache.tajo.plan.logical.NodeType;
 import org.apache.tajo.plan.util.PlannerUtil;
-import org.apache.tajo.plan.verifier.LogicalPlanVerifier;
-import org.apache.tajo.plan.verifier.PreLogicalPlanVerifier;
-import org.apache.tajo.plan.verifier.VerificationState;
-import org.apache.tajo.plan.verifier.VerifyException;
+import org.apache.tajo.plan.verifier.*;
+import org.apache.tajo.session.Session;
 import org.apache.tajo.storage.TablespaceManager;
 import org.apache.tajo.util.CommonTestingUtil;
 
@@ -60,6 +57,7 @@ import java.io.IOException;
 import java.sql.SQLException;
 import java.util.concurrent.TimeUnit;
 
+import static org.apache.tajo.exception.ReturnStateUtil.returnError;
 import static org.apache.tajo.ipc.ClientProtos.SubmitQueryResponse;
 
 public class GlobalEngine extends AbstractService {
@@ -187,20 +185,17 @@ public class GlobalEngine extends AbstractService {
       LogicalPlan plan = createLogicalPlan(queryContext, planningContext);
       SubmitQueryResponse response = queryExecutor.execute(queryContext, 
session, query, jsonExpr, plan);
       return response;
+
+
     } catch (Throwable t) {
+      ExceptionUtil.printStackTraceIfError(LOG, t);
+
       context.getSystemMetrics().counter("Query", "errorQuery").inc();
-      LOG.error("\nStack Trace:\n" + StringUtils.stringifyException(t));
       SubmitQueryResponse.Builder responseBuilder = 
SubmitQueryResponse.newBuilder();
       responseBuilder.setUserName(queryContext.get(SessionVars.USERNAME));
       responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
       responseBuilder.setIsForwarded(true);
-      responseBuilder.setResultCode(ClientProtos.ResultCode.ERROR);
-      String errorMessage = t.getMessage();
-      if (t.getMessage() == null) {
-        errorMessage = t.getClass().getName();
-      }
-      responseBuilder.setErrorMessage(errorMessage);
-      responseBuilder.setErrorTrace(StringUtils.stringifyException(t));
+      responseBuilder.setState(ReturnStateUtil.returnError(t));
       return responseBuilder.build();
     }
   }
@@ -227,8 +222,7 @@ public class GlobalEngine extends AbstractService {
     }
   }
 
-  public QueryId updateQuery(QueryContext queryContext, String sql, boolean 
isJson) throws IOException,
-      SQLException, PlanningException {
+  public QueryId updateQuery(QueryContext queryContext, String sql, boolean 
isJson) throws Throwable {
     try {
       LOG.info("SQL: " + sql);
 
@@ -249,22 +243,22 @@ public class GlobalEngine extends AbstractService {
         ddlExecutor.execute(queryContext, plan);
         return QueryIdFactory.NULL_QUERY_ID;
       }
-    } catch (Exception e) {
-      LOG.error(e.getMessage(), e);
-      throw new IOException(e.getMessage(), e);
+    } catch (Throwable e) {
+      ExceptionUtil.printStackTraceIfError(LOG, e);
+      throw e;
     }
   }
 
-  private LogicalPlan createLogicalPlan(QueryContext queryContext, Expr 
expression) throws PlanningException {
+  private LogicalPlan createLogicalPlan(QueryContext queryContext, Expr 
expression) throws Throwable {
 
     VerificationState state = new VerificationState();
     preVerifier.verify(queryContext, state, expression);
     if (!state.verified()) {
       StringBuilder sb = new StringBuilder();
-      for (String error : state.getErrorMessages()) {
-        sb.append(error).append("\n");
+
+      for (Throwable error : state.getErrors()) {
+        throw error;
       }
-      throw new VerifyException(sb.toString());
     }
 
     LogicalPlan plan = planner.createPlan(queryContext, expression);
@@ -283,11 +277,9 @@ public class GlobalEngine extends AbstractService {
     verifyInsertTableSchema(queryContext, state, plan);
 
     if (!state.verified()) {
-      StringBuilder sb = new StringBuilder();
-      for (String error : state.getErrorMessages()) {
-        sb.append(error).append("\n");
+      for (Throwable error : state.getErrors()) {
+        throw error;
       }
-      throw new VerifyException(sb.toString());
     }
 
     return plan;
@@ -306,7 +298,7 @@ public class GlobalEngine extends AbstractService {
           
TablespaceManager.get(tableDesc.getUri()).get().verifySchemaToWrite(tableDesc, 
outSchema);
 
         } catch (Throwable t) {
-          state.addVerification(t.getMessage());
+          
state.addVerification(SyntaxErrorUtil.makeSyntaxError(t.getMessage()));
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java 
b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
index e0332d5..6fbe968 100644
--- 
a/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
+++ 
b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
@@ -22,7 +22,6 @@ import com.google.common.base.Preconditions;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.RpcController;
 import com.google.protobuf.ServiceException;
-import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.fs.FileSystem;
@@ -32,11 +31,13 @@ import org.apache.hadoop.service.AbstractService;
 import org.apache.tajo.QueryId;
 import org.apache.tajo.QueryIdFactory;
 import org.apache.tajo.TajoIdProtos;
-import org.apache.tajo.TajoProtos;
+import org.apache.tajo.TajoProtos.QueryState;
 import org.apache.tajo.catalog.*;
-import org.apache.tajo.catalog.exception.NoSuchDatabaseException;
+import org.apache.tajo.catalog.exception.UndefinedDatabaseException;
 import org.apache.tajo.catalog.partition.PartitionMethodDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
+import org.apache.tajo.catalog.proto.CatalogProtos.FunctionListResponse;
+import org.apache.tajo.catalog.proto.CatalogProtos.TableResponse;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.conf.TajoConf.ConfVars;
 import org.apache.tajo.engine.query.QueryContext;
@@ -53,11 +54,7 @@ import org.apache.tajo.plan.logical.PartitionedTableScanNode;
 import org.apache.tajo.plan.logical.ScanNode;
 import org.apache.tajo.querymaster.QueryJobEvent;
 import org.apache.tajo.rpc.BlockingRpcServer;
-import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.BoolProto;
-import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.StringListProto;
-import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.StringProto;
-import org.apache.tajo.session.InvalidSessionException;
-import org.apache.tajo.session.NoSuchSessionVariableException;
+import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.*;
 import org.apache.tajo.session.Session;
 import org.apache.tajo.util.KeyValueSet;
 import org.apache.tajo.util.NetUtils;
@@ -68,8 +65,7 @@ import java.net.InetSocketAddress;
 import java.util.*;
 
 import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME;
-import static 
org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.KeyValueProto;
-import static 
org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.KeyValueSetProto;
+import static org.apache.tajo.exception.ReturnStateUtil.*;
 
 public class TajoMasterClientService extends AbstractService {
   private final static Log LOG = 
LogFactory.getLog(TajoMasterClientService.class);
@@ -82,8 +78,6 @@ public class TajoMasterClientService extends AbstractService {
 
   private final BoolProto BOOL_TRUE =
       BoolProto.newBuilder().setValue(true).build();
-  private final BoolProto BOOL_FALSE =
-      BoolProto.newBuilder().setValue(false).build();
 
   public TajoMasterClientService(MasterContext context) {
     super(TajoMasterClientService.class.getName());
@@ -134,57 +128,42 @@ public class TajoMasterClientService extends 
AbstractService {
 
         if (!context.getCatalog().existDatabase(databaseName)) {
           LOG.info("Session creation is canceled due to absent base database 
\"" + databaseName + "\".");
-          throw new NoSuchDatabaseException(databaseName);
+          throw new UndefinedDatabaseException(databaseName);
         }
 
         String sessionId =
             context.getSessionManager().createSession(request.getUsername(), 
databaseName);
         CreateSessionResponse.Builder builder = 
CreateSessionResponse.newBuilder();
-        builder.setResultCode(ResultCode.OK);
+        builder.setState(OK);
         
builder.setSessionId(TajoIdProtos.SessionIdProto.newBuilder().setId(sessionId).build());
         
builder.setSessionVars(ProtoUtil.convertFromMap(context.getSessionManager().getAllVariables(sessionId)));
         return builder.build();
-      } catch (NoSuchDatabaseException nsde) {
-        CreateSessionResponse.Builder builder = 
CreateSessionResponse.newBuilder();
-        builder.setResultCode(ResultCode.ERROR);
-        builder.setMessage(nsde.getMessage());
-        return builder.build();
-      } catch (InvalidSessionException e) {
+
+      } catch (Throwable t) {
         CreateSessionResponse.Builder builder = 
CreateSessionResponse.newBuilder();
-        builder.setResultCode(ResultCode.ERROR);
-        builder.setMessage(e.getMessage());
+        builder.setState(returnError(t));
         return builder.build();
       }
     }
 
     @Override
-    public BoolProto removeSession(RpcController controller, 
TajoIdProtos.SessionIdProto request)
+    public ReturnState removeSession(RpcController controller, 
TajoIdProtos.SessionIdProto request)
         throws ServiceException {
 
       if (request != null) {
         context.getSessionManager().removeSession(request.getId());
       }
 
-      return BOOL_TRUE;
+      return OK;
     }
 
-    public SessionUpdateResponse buildSessionUpdateOnSuccess(Map<String, 
String> variables) {
-      SessionUpdateResponse.Builder builder = 
SessionUpdateResponse.newBuilder();
-      builder.setResultCode(ResultCode.OK);
-      builder.setSessionVars(new KeyValueSet(variables).getProto());
-      return builder.build();
-    }
+    @Override
+    public SessionUpdateResponse updateSessionVariables(RpcController 
controller,
+                                                        
UpdateSessionVariableRequest request)
+        throws ServiceException {
 
-    public SessionUpdateResponse buildSessionUpdateOnError(String message) {
       SessionUpdateResponse.Builder builder = 
SessionUpdateResponse.newBuilder();
-      builder.setResultCode(ResultCode.ERROR);
-      builder.setMessage(message);
-      return builder.build();
-    }
 
-    @Override
-    public SessionUpdateResponse updateSessionVariables(RpcController 
controller, UpdateSessionVariableRequest request)
-        throws ServiceException {
       try {
         String sessionId = request.getSessionId().getId();
         for (KeyValueProto kv : request.getSessionVars().getKeyvalList()) {
@@ -193,9 +172,15 @@ public class TajoMasterClientService extends 
AbstractService {
         for (String unsetVariable : request.getUnsetVariablesList()) {
           context.getSessionManager().removeVariable(sessionId, unsetVariable);
         }
-        return 
buildSessionUpdateOnSuccess(context.getSessionManager().getAllVariables(sessionId));
+
+
+        builder.setState(OK);
+        builder.setSessionVars(new 
KeyValueSet(context.getSessionManager().getAllVariables(sessionId)).getProto());
+        return builder.build();
+
       } catch (Throwable t) {
-        return buildSessionUpdateOnError("Invalid Session Id" + 
request.getSessionId());
+        builder.setState(returnError(t));
+        return builder.build();
       }
     }
 
@@ -212,61 +197,72 @@ public class TajoMasterClientService extends 
AbstractService {
     }
 
     @Override
-    public BoolProto existSessionVariable(RpcController controller, 
SessionedStringProto request)
+    public ReturnState existSessionVariable(RpcController controller, 
SessionedStringProto request)
         throws ServiceException {
       try {
         String value = 
context.getSessionManager().getVariable(request.getSessionId().getId(), 
request.getValue());
         if (value != null) {
-          return ProtoUtil.TRUE;
+          return OK;
         } else {
-          return ProtoUtil.FALSE;
+          return errNoSessionVar(request.getValue());
         }
-      } catch (NoSuchSessionVariableException nssv) {
-        return ProtoUtil.FALSE;
       } catch (Throwable t) {
-        throw new ServiceException(t);
+        return returnError(t);
       }
     }
 
     @Override
-    public KeyValueSetProto getAllSessionVariables(RpcController controller,
+    public KeyValueSetResponse getAllSessionVariables(RpcController controller,
                                                                  
TajoIdProtos.SessionIdProto request)
         throws ServiceException {
+
       try {
         String sessionId = request.getId();
         KeyValueSet keyValueSet = new KeyValueSet();
         
keyValueSet.putAll(context.getSessionManager().getAllVariables(sessionId));
-        return keyValueSet.getProto();
+
+        return KeyValueSetResponse.newBuilder()
+            .setState(OK)
+            .setValue(keyValueSet.getProto())
+            .build();
+
       } catch (Throwable t) {
-        throw new ServiceException(t);
+        return KeyValueSetResponse.newBuilder()
+            .setState(returnError(t))
+            .build();
       }
     }
 
     @Override
-    public StringProto getCurrentDatabase(RpcController controller, 
TajoIdProtos.SessionIdProto request)
+    public StringResponse getCurrentDatabase(RpcController controller, 
TajoIdProtos.SessionIdProto request)
         throws ServiceException {
       try {
-        String sessionId = request.getId();
-        return 
ProtoUtil.convertString(context.getSessionManager().getSession(sessionId).getCurrentDatabase());
+        return StringResponse.newBuilder()
+            .setState(OK)
+            
.setValue(context.getSessionManager().getSession(request.getId()).getCurrentDatabase())
+            .build();
+
       } catch (Throwable t) {
-        throw new ServiceException(t);
+        return StringResponse.newBuilder()
+            .setState(returnError(t))
+            .build();
       }
     }
 
     @Override
-    public BoolProto selectDatabase(RpcController controller, 
SessionedStringProto request) throws ServiceException {
+    public ReturnState selectDatabase(RpcController controller, 
SessionedStringProto request) throws ServiceException {
       try {
         String sessionId = request.getSessionId().getId();
         String databaseName = request.getValue();
 
         if (context.getCatalog().existDatabase(databaseName)) {
           
context.getSessionManager().getSession(sessionId).selectDatabase(databaseName);
-          return ProtoUtil.TRUE;
+          return OK;
         } else {
-          throw new ServiceException(new 
NoSuchDatabaseException(databaseName));
+          return errUndefinedDatabase(databaseName);
         }
       } catch (Throwable t) {
-        throw new ServiceException(t);
+        return returnError(t);
       }
     }
 
@@ -278,50 +274,43 @@ public class TajoMasterClientService extends 
AbstractService {
         if(LOG.isDebugEnabled()) {
           LOG.debug("Query [" + request.getQuery() + "] is submitted");
         }
+
         return context.getGlobalEngine().executeQuery(session, 
request.getQuery(), request.getIsJson());
+
       } catch (Exception e) {
-        LOG.error(e.getMessage(), e);
-        SubmitQueryResponse.Builder responseBuilder = 
ClientProtos.SubmitQueryResponse.newBuilder();
-        responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
-        responseBuilder.setIsForwarded(true);
-        
responseBuilder.setUserName(context.getConf().getVar(ConfVars.USERNAME));
-        responseBuilder.setResultCode(ResultCode.ERROR);
-        if (e.getMessage() != null) {
-          responseBuilder.setErrorMessage(ExceptionUtils.getStackTrace(e));
-        } else {
-          responseBuilder.setErrorMessage("Internal Error");
-        }
-        return responseBuilder.build();
+
+        return ClientProtos.SubmitQueryResponse.newBuilder()
+            .setState(returnError(e))
+            .setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto())
+            .setIsForwarded(true)
+            .setUserName(context.getConf().getVar(ConfVars.USERNAME))
+            .build();
+
       }
     }
 
     @Override
     public UpdateQueryResponse updateQuery(RpcController controller, 
QueryRequest request) throws ServiceException {
+      UpdateQueryResponse.Builder builder = UpdateQueryResponse.newBuilder();
 
       try {
         Session session = 
context.getSessionManager().getSession(request.getSessionId().getId());
         QueryContext queryContext = new QueryContext(conf, session);
+        context.getGlobalEngine().updateQuery(queryContext, 
request.getQuery(), request.getIsJson());
+        builder.setState(OK);
 
-        UpdateQueryResponse.Builder builder = UpdateQueryResponse.newBuilder();
-        try {
-          context.getGlobalEngine().updateQuery(queryContext, 
request.getQuery(), request.getIsJson());
-          builder.setResultCode(ResultCode.OK);
-          return builder.build();
-        } catch (Exception e) {
-          builder.setResultCode(ResultCode.ERROR);
-          if (e.getMessage() == null) {
-            builder.setErrorMessage(ExceptionUtils.getStackTrace(e));
-          }
-          return builder.build();
-        }
       } catch (Throwable t) {
-        throw new ServiceException(t);
+        builder.setState(returnError(t));
       }
+      return builder.build();
     }
 
     @Override
     public GetQueryResultResponse getQueryResult(RpcController controller,
                                                  GetQueryResultRequest 
request) throws ServiceException {
+
+      GetQueryResultResponse.Builder builder = 
GetQueryResultResponse.newBuilder();
+
       try {
         context.getSessionManager().touch(request.getSessionId().getId());
         QueryId queryId = new QueryId(request.getQueryId());
@@ -336,29 +325,30 @@ public class TajoMasterClientService extends 
AbstractService {
           queryInfo = queryInProgress.getQueryInfo();
         }
 
-        GetQueryResultResponse.Builder builder = 
GetQueryResultResponse.newBuilder();
         
builder.setTajoUserName(UserGroupInformation.getCurrentUser().getUserName());
 
         // If we cannot the QueryInfo instance from the finished list,
         // the query result was expired due to timeout.
         // In this case, we will result in error.
         if (queryInfo == null) {
-          builder.setErrorMessage("No such query: " + queryId.toString());
+          builder.setState(errNoSuchQueryId(queryId));
           return builder.build();
         }
 
         switch (queryInfo.getQueryState()) {
           case QUERY_SUCCEEDED:
             if (queryInfo.hasResultdesc()) {
+              builder.setState(OK);
               builder.setTableDesc(queryInfo.getResultDesc().getProto());
             }
             break;
           case QUERY_FAILED:
           case QUERY_ERROR:
-            builder.setErrorMessage("Query " + queryId + " is failed");
+            builder.setState(errNoData(queryId));
             break;
+
           default:
-            builder.setErrorMessage("Query " + queryId + " is still running");
+            builder.setState(errIncompleteQuery(queryId));
         }
 
         return builder.build();
@@ -408,9 +398,10 @@ public class TajoMasterClientService extends 
AbstractService {
     public GetQueryListResponse getFinishedQueryList(RpcController controller, 
TajoIdProtos.SessionIdProto request)
         throws ServiceException {
 
+      GetQueryListResponse.Builder builder = GetQueryListResponse.newBuilder();
+
       try {
         context.getSessionManager().touch(request.getId());
-        GetQueryListResponse.Builder builder = 
GetQueryListResponse.newBuilder();
 
         Collection<QueryInfo> queries
             = context.getQueryJobManager().getFinishedQueries();
@@ -432,16 +423,16 @@ public class TajoMasterClientService extends 
AbstractService {
           builder.addQueryList(infoBuilder.build());
         }
 
-        GetQueryListResponse result = builder.build();
-        return result;
+        builder.setState(OK);
       } catch (Throwable t) {
-        throw new ServiceException(t);
+        builder.setState(returnError(t));
       }
+
+      return builder.build();
     }
 
     @Override
-    public GetQueryStatusResponse getQueryStatus(RpcController controller,
-                                                 GetQueryStatusRequest request)
+    public GetQueryStatusResponse getQueryStatus(RpcController controller, 
GetQueryStatusRequest request)
         throws ServiceException {
 
       try {
@@ -452,8 +443,8 @@ public class TajoMasterClientService extends 
AbstractService {
         builder.setQueryId(request.getQueryId());
 
         if (queryId.equals(QueryIdFactory.NULL_QUERY_ID)) {
-          builder.setResultCode(ResultCode.OK);
-          builder.setState(TajoProtos.QueryState.QUERY_SUCCEEDED);
+          builder.setState(OK);
+          builder.setQueryState(QueryState.QUERY_SUCCEEDED);
         } else {
           QueryInProgress queryInProgress = 
context.getQueryJobManager().getQueryInProgress(queryId);
 
@@ -466,8 +457,8 @@ public class TajoMasterClientService extends 
AbstractService {
           }
 
           if (queryInfo != null) {
-            builder.setResultCode(ResultCode.OK);
-            builder.setState(queryInfo.getQueryState());
+            builder.setState(OK);
+            builder.setQueryState(queryInfo.getQueryState());
 
             boolean isCreateTable = 
queryInfo.getQueryContext().isCreateTable();
             boolean isInsert = queryInfo.getQueryContext().isInsert();
@@ -479,7 +470,7 @@ public class TajoMasterClientService extends 
AbstractService {
               builder.setQueryMasterHost(queryInfo.getQueryMasterHost());
               builder.setQueryMasterPort(queryInfo.getQueryMasterClientPort());
             }
-            if (queryInfo.getQueryState() == 
TajoProtos.QueryState.QUERY_SUCCEEDED) {
+            if (queryInfo.getQueryState() == QueryState.QUERY_SUCCEEDED) {
               builder.setFinishTime(queryInfo.getFinishTime());
             } else {
               builder.setFinishTime(System.currentTimeMillis());
@@ -487,11 +478,10 @@ public class TajoMasterClientService extends 
AbstractService {
           } else {
             Session session = 
context.getSessionManager().getSession(request.getSessionId().getId());
             if (session.getNonForwardQueryResultScanner(queryId) != null) {
-              builder.setResultCode(ResultCode.OK);
-              builder.setState(TajoProtos.QueryState.QUERY_SUCCEEDED);
+              builder.setState(OK);
+              builder.setQueryState(QueryState.QUERY_SUCCEEDED);
             } else {
-              builder.setResultCode(ResultCode.ERROR);
-              builder.setErrorMessage("No such query: " + queryId.toString());
+              builder.setState(errNoSuchQueryId(queryId));
             }
           }
         }
@@ -543,33 +533,33 @@ public class TajoMasterClientService extends 
AbstractService {
         resultSetBuilder.addAllSerializedTuples(rows);
 
         builder.setResultSet(resultSetBuilder.build());
-        builder.setResultCode(ResultCode.OK);
+        builder.setState(OK);
 
         LOG.info("Send result to client for " +
             request.getSessionId().getId() + "," + queryId + ", " + 
rows.size() + " rows");
 
       } catch (Throwable t) {
-        LOG.error(t.getMessage(), t);
         builder.setResultSet(resultSetBuilder.build()); // required field
-        builder.setResultCode(ResultCode.ERROR);
-        String errorMessage = t.getMessage() == null ? t.getClass().getName() 
: t.getMessage();
-        builder.setErrorMessage(errorMessage);
-        
builder.setErrorTrace(org.apache.hadoop.util.StringUtils.stringifyException(t));
+        builder.setState(returnError(t));
       }
+
       return builder.build();
     }
 
     @Override
-    public BoolProto closeNonForwardQuery(RpcController controller, 
QueryIdRequest request) throws ServiceException {
+    public ReturnState closeNonForwardQuery(RpcController controller, 
QueryIdRequest request)
+        throws ServiceException {
+
       try {
         context.getSessionManager().touch(request.getSessionId().getId());
         Session session = 
context.getSessionManager().getSession(request.getSessionId().getId());
         QueryId queryId = new QueryId(request.getQueryId());
 
         session.closeNonForwardQueryResultScanner(queryId);
-        return BOOL_TRUE;
+        return OK;
+
       } catch (Throwable t) {
-        throw new ServiceException(t);
+        return returnError(t);
       }
     }
 
@@ -594,34 +584,34 @@ public class TajoMasterClientService extends 
AbstractService {
         if (queryInfo != null) {
           builder.setQueryInfo(queryInfo.getProto());
         }
-        builder.setResultCode(ResultCode.OK);
+        builder.setState(OK);
+
       } catch (Throwable t) {
-        LOG.warn(t.getMessage(), t);
-        builder.setResultCode(ResultCode.ERROR);
-        
builder.setErrorMessage(org.apache.hadoop.util.StringUtils.stringifyException(t));
+        builder.setState(returnError(t));
       }
 
       return builder.build();
     }
 
     @Override
-    public BoolProto killQuery(RpcController controller, QueryIdRequest 
request) throws ServiceException {
+    public ReturnState killQuery(RpcController controller, QueryIdRequest 
request) throws ServiceException {
       try {
         context.getSessionManager().touch(request.getSessionId().getId());
         QueryId queryId = new QueryId(request.getQueryId());
 
         QueryInProgress progress = 
context.getQueryJobManager().getQueryInProgress(queryId);
         if (progress == null || progress.isFinishState() || 
progress.isKillWait()) {
-          return BOOL_TRUE;
+          return OK;
         }
 
         QueryManager queryManager = context.getQueryJobManager();
         queryManager.getEventHandler().handle(new 
QueryJobEvent(QueryJobEvent.Type.QUERY_JOB_KILL,
             new QueryInfo(queryId)));
-        return BOOL_TRUE;
+
+        return OK;
+
       } catch (Throwable t) {
-        LOG.error(t.getMessage(), t);
-        throw new ServiceException(t);
+        return returnError(t);
       }
     }
 
@@ -629,9 +619,11 @@ public class TajoMasterClientService extends 
AbstractService {
     public GetClusterInfoResponse getClusterInfo(RpcController controller,
                                                  GetClusterInfoRequest request)
         throws ServiceException {
+
+      GetClusterInfoResponse.Builder builder = 
GetClusterInfoResponse.newBuilder();
+
       try {
         context.getSessionManager().touch(request.getSessionId().getId());
-        GetClusterInfoResponse.Builder builder= 
GetClusterInfoResponse.newBuilder();
 
         List<NodeStatus> nodeStatusList = new 
ArrayList<NodeStatus>(context.getResourceManager().getRMContext().getNodes().values());
         Collections.sort(nodeStatusList);
@@ -651,71 +643,86 @@ public class TajoMasterClientService extends 
AbstractService {
           builder.addWorkerList(workerBuilder.build());
         }
 
-        return builder.build();
+        builder.setState(OK);
+
       } catch (Throwable t) {
-        throw new ServiceException(t);
+        builder.setState(returnError(t));
       }
+
+      return builder.build();
     }
 
     @Override
-    public BoolProto createDatabase(RpcController controller, 
SessionedStringProto request) throws ServiceException {
+    public ReturnState createDatabase(RpcController controller, 
SessionedStringProto request) throws ServiceException {
       try {
         Session session = 
context.getSessionManager().getSession(request.getSessionId().getId());
         QueryContext queryContext = new QueryContext(conf, session);
 
         if 
(context.getGlobalEngine().getDDLExecutor().createDatabase(queryContext, 
request.getValue(), null, false)) {
-          return BOOL_TRUE;
+          return OK;
         } else {
-          return BOOL_FALSE;
+          return errDuplicateDatabase(request.getValue());
         }
-      } catch (Throwable e) {
-        throw new ServiceException(e);
+
+      } catch (Throwable t) {
+        return returnError(t);
       }
     }
 
     @Override
-    public BoolProto existDatabase(RpcController controller, 
SessionedStringProto request) throws ServiceException {
+    public ReturnState existDatabase(RpcController controller, 
SessionedStringProto request) throws ServiceException {
       try {
         context.getSessionManager().touch(request.getSessionId().getId());
         if (catalog.existDatabase(request.getValue())) {
-          return BOOL_TRUE;
+          return OK;
         } else {
-          return BOOL_FALSE;
+          return errUndefinedDatabase(request.getValue());
         }
-      } catch (Throwable e) {
-        throw new ServiceException(e);
+
+      } catch (Throwable t) {
+        return returnError(t);
       }
     }
 
     @Override
-    public BoolProto dropDatabase(RpcController controller, 
SessionedStringProto request) throws ServiceException {
+    public ReturnState dropDatabase(RpcController controller, 
SessionedStringProto request) throws ServiceException {
       try {
         Session session = 
context.getSessionManager().getSession(request.getSessionId().getId());
         QueryContext queryContext = new QueryContext(conf, session);
 
         if 
(context.getGlobalEngine().getDDLExecutor().dropDatabase(queryContext, 
request.getValue(), false)) {
-          return BOOL_TRUE;
+          return OK;
         } else {
-          return BOOL_FALSE;
+          return errUndefinedDatabase(request.getValue());
         }
-      } catch (Throwable e) {
-        throw new ServiceException(e);
+
+      } catch (Throwable t) {
+        return returnError(t);
       }
     }
 
     @Override
-    public StringListProto getAllDatabases(RpcController controller, 
TajoIdProtos.SessionIdProto
+    public StringListResponse getAllDatabases(RpcController controller, 
TajoIdProtos.SessionIdProto
         request) throws ServiceException {
+
       try {
         context.getSessionManager().touch(request.getId());
-        return ProtoUtil.convertStrings(catalog.getAllDatabaseNames());
-      } catch (Throwable e) {
-        throw new ServiceException(e);
+
+        return StringListResponse.newBuilder()
+            .setState(OK)
+            .addAllValues(catalog.getAllDatabaseNames())
+            .build();
+
+      } catch (Throwable t) {
+        return StringListResponse.newBuilder()
+            .setState(returnError(t))
+            .build();
       }
     }
 
     @Override
-    public BoolProto existTable(RpcController controller, SessionedStringProto 
request) throws ServiceException {
+    public ReturnState existTable(RpcController controller, 
SessionedStringProto request) throws ServiceException {
+
       try {
         Session session = 
context.getSessionManager().getSession(request.getSessionId().getId());
 
@@ -731,17 +738,18 @@ public class TajoMasterClientService extends 
AbstractService {
         }
 
         if (catalog.existsTable(databaseName, tableName)) {
-          return BOOL_TRUE;
+          return OK;
         } else {
-          return BOOL_FALSE;
+          return errUndefinedTable(tableName);
         }
-      } catch (Throwable e) {
-        throw new ServiceException(e);
+
+      } catch (Throwable t) {
+        return returnError(t);
       }
     }
 
     @Override
-    public StringListProto getTableList(RpcController controller,
+    public StringListResponse getTableList(RpcController controller,
                                              SessionedStringProto request) 
throws ServiceException {
       try {
         Session session = 
context.getSessionManager().getSession(request.getSessionId().getId());
@@ -752,11 +760,16 @@ public class TajoMasterClientService extends 
AbstractService {
           databaseName = session.getCurrentDatabase();
         }
         Collection<String> tableNames = catalog.getAllTableNames(databaseName);
-        StringListProto.Builder builder = StringListProto.newBuilder();
-        builder.addAllValues(tableNames);
-        return builder.build();
+
+        return StringListResponse.newBuilder()
+          .setState(OK)
+          .addAllValues(tableNames)
+          .build();
+
       } catch (Throwable t) {
-        throw new ServiceException(t);
+        return StringListResponse.newBuilder()
+            .setState(returnError(t))
+            .build();
       }
     }
 
@@ -766,8 +779,7 @@ public class TajoMasterClientService extends 
AbstractService {
 
         if (!request.hasValue()) {
           return TableResponse.newBuilder()
-              .setResultCode(ResultCode.ERROR)
-              .setErrorMessage("table name is required.")
+              .setState(errInvalidRpcCall("Table name is required"))
               .build();
         }
 
@@ -786,13 +798,12 @@ public class TajoMasterClientService extends 
AbstractService {
 
         if (catalog.existsTable(databaseName, tableName)) {
           return TableResponse.newBuilder()
-              .setResultCode(ResultCode.OK)
-              .setTableDesc(catalog.getTableDesc(databaseName, 
tableName).getProto())
+              .setState(OK)
+              .setTable(catalog.getTableDesc(databaseName, 
tableName).getProto())
               .build();
         } else {
           return TableResponse.newBuilder()
-              .setResultCode(ResultCode.ERROR)
-              .setErrorMessage("ERROR: no such a table: " + request.getValue())
+              .setState(errUndefinedTable(request.getValue()))
               .build();
         }
       } catch (Throwable t) {
@@ -821,46 +832,47 @@ public class TajoMasterClientService extends 
AbstractService {
           partitionDesc = new PartitionMethodDesc(request.getPartition());
         }
 
-        TableDesc desc;
-        try {
-          desc = 
context.getGlobalEngine().getDDLExecutor().createTable(queryContext, 
request.getName(),
-              null, meta.getStoreType(), schema, meta, path.toUri(), true, 
partitionDesc, false);
-        } catch (Exception e) {
-          return TableResponse.newBuilder()
-              .setResultCode(ResultCode.ERROR)
-              .setErrorMessage(e.getMessage()).build();
-        }
+        TableDesc desc = 
context.getGlobalEngine().getDDLExecutor().createTable(
+            queryContext,
+            request.getName(),
+            null,
+            meta.getStoreType(),
+            schema,
+            meta,
+            path.toUri(),
+            true,
+            partitionDesc,
+            false
+        );
 
         return TableResponse.newBuilder()
-            .setResultCode(ResultCode.OK)
-            .setTableDesc(desc.getProto()).build();
-      } catch (InvalidSessionException ise) {
-        return TableResponse.newBuilder()
-            .setResultCode(ResultCode.ERROR)
-            .setErrorMessage(ise.getMessage()).build();
-      } catch (IOException ioe) {
+            .setState(OK)
+            .setTable(desc.getProto()).build();
+
+      } catch (Throwable t) {
         return TableResponse.newBuilder()
-            .setResultCode(ResultCode.ERROR)
-            .setErrorMessage(ioe.getMessage()).build();
+            .setState(returnError(t))
+            .build();
       }
     }
 
     @Override
-    public BoolProto dropTable(RpcController controller, DropTableRequest 
dropTable) throws ServiceException {
+    public ReturnState dropTable(RpcController controller, DropTableRequest 
dropTable) throws ServiceException {
       try {
         Session session = 
context.getSessionManager().getSession(dropTable.getSessionId().getId());
         QueryContext queryContext = new QueryContext(conf, session);
 
         context.getGlobalEngine().getDDLExecutor().dropTable(queryContext, 
dropTable.getName(), false,
             dropTable.getPurge());
-        return BOOL_TRUE;
+        return OK;
+
       } catch (Throwable t) {
-        throw new ServiceException(t);
+        return returnError(t);
       }
     }
 
     @Override
-    public FunctionResponse getFunctionList(RpcController controller, 
SessionedStringProto request)
+    public FunctionListResponse getFunctionList(RpcController controller, 
SessionedStringProto request)
         throws ServiceException {
 
       try {
@@ -880,12 +892,13 @@ public class TajoMasterClientService extends 
AbstractService {
             }
           }
         }
-        return FunctionResponse.newBuilder()
-            .setResultCode(ResultCode.OK)
-            .addAllFunctions(functionProtos)
+        return FunctionListResponse.newBuilder()
+            .setState(OK)
+            .addAllFunction(functionProtos)
             .build();
+
       } catch (Throwable t) {
-        throw new ServiceException(t);
+        return 
FunctionListResponse.newBuilder().setState(returnError(t)).build();
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java 
b/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java
index b9814eb..b0024dc 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java
@@ -35,6 +35,7 @@ import 
org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto;
 import org.apache.tajo.catalog.proto.CatalogProtos.PartitionKeyProto;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.engine.query.QueryContext;
+import org.apache.tajo.exception.TajoInternalError;
 import org.apache.tajo.master.TajoMaster;
 import org.apache.tajo.plan.LogicalPlan;
 import org.apache.tajo.plan.logical.*;
@@ -156,7 +157,7 @@ public class DDLExecutor {
         LOG.info("database \"" + databaseName + "\" is already exists." );
         return true;
       } else {
-        throw new AlreadyExistsDatabaseException(databaseName);
+        throw new DuplicateDatabaseException(databaseName);
       }
     }
 
@@ -177,7 +178,7 @@ public class DDLExecutor {
         LOG.info("database \"" + databaseName + "\" does not exists." );
         return true;
       } else { // Otherwise, it causes an exception.
-        throw new NoSuchDatabaseException(databaseName);
+        throw new UndefinedDatabaseException(databaseName);
       }
     }
 
@@ -196,8 +197,8 @@ public class DDLExecutor {
   //--------------------------------------------------------------------------
   private TableDesc createTable(QueryContext queryContext, CreateTableNode 
createTable, boolean ifNotExists)
       throws IOException {
-    TableMeta meta;
 
+    TableMeta meta;
     if (createTable.hasOptions()) {
       meta = CatalogUtil.newTableMeta(createTable.getStorageType(), 
createTable.getOptions());
     } else {
@@ -230,6 +231,7 @@ public class DDLExecutor {
                                boolean isExternal,
                                @Nullable PartitionMethodDesc partitionDesc,
                                boolean ifNotExists) throws IOException {
+
     String databaseName;
     String simpleTableName;
     if (CatalogUtil.isFQTableName(tableName)) {
@@ -249,7 +251,7 @@ public class DDLExecutor {
         LOG.info("relation \"" + qualifiedName + "\" is already exists." );
         return catalog.getTableDesc(databaseName, simpleTableName);
       } else {
-        throw new AlreadyExistsTableException(qualifiedName);
+        throw new DuplicateTableException(qualifiedName);
       }
     }
 
@@ -277,7 +279,7 @@ public class DDLExecutor {
       return desc;
     } else {
       LOG.info("Table creation " + tableName + " is failed.");
-      throw new CatalogException("Cannot create table \"" + tableName + "\".");
+      throw new TajoInternalError("Cannot create table \"" + tableName + "\"");
     }
   }
 
@@ -307,7 +309,7 @@ public class DDLExecutor {
         LOG.info("relation \"" + qualifiedName + "\" is already exists." );
         return true;
       } else { // Otherwise, it causes an exception.
-        throw new NoSuchTableException(qualifiedName);
+        throw new UndefinedTableException(qualifiedName);
       }
     }
 
@@ -350,7 +352,7 @@ public class DDLExecutor {
       final String qualifiedName = CatalogUtil.buildFQName(databaseName, 
simpleTableName);
 
       if (!catalog.existsTable(databaseName, simpleTableName)) {
-        throw new NoSuchTableException(qualifiedName);
+        throw new UndefinedTableException(qualifiedName);
       }
 
       Path warehousePath = new 
Path(TajoConf.getWarehouseDir(context.getConf()), databaseName);
@@ -405,7 +407,7 @@ public class DDLExecutor {
     final String qualifiedName = CatalogUtil.buildFQName(databaseName, 
simpleTableName);
 
     if (!catalog.existsTable(databaseName, simpleTableName)) {
-      throw new NoSuchTableException(qualifiedName);
+      throw new UndefinedTableException(qualifiedName);
     }
 
     Path partitionPath = null;
@@ -419,21 +421,13 @@ public class DDLExecutor {
       desc = catalog.getTableDesc(databaseName, simpleTableName);
     }
 
-    // When adding a partition or dropping a partition, check existing 
partition column information.
-    if (alterTable.getAlterTableOpType() == AlterTableOpType.ADD_PARTITION
-      || alterTable.getAlterTableOpType() == AlterTableOpType.DROP_PARTITION) {
-      pair = 
CatalogUtil.getPartitionKeyNamePair(alterTable.getPartitionColumns(), 
alterTable.getPartitionValues());
-      partitionDescProto = catalog.getPartition(databaseName, simpleTableName, 
pair.getSecond());
-      existPartitionColumnNames(qualifiedName, 
alterTable.getPartitionColumns());
-    }
-
     switch (alterTable.getAlterTableOpType()) {
     case RENAME_TABLE:
       if (!catalog.existsTable(databaseName, simpleTableName)) {
-        throw new NoSuchTableException(alterTable.getTableName());
+        throw new UndefinedTableException(alterTable.getTableName());
       }
       if (catalog.existsTable(databaseName, alterTable.getNewTableName())) {
-        throw new AlreadyExistsTableException(alterTable.getNewTableName());
+        throw new DuplicateTableException(alterTable.getNewTableName());
       }
 
       if (!desc.isExternal()) { // if the table is the managed table
@@ -456,15 +450,15 @@ public class DDLExecutor {
           AlterTableType.RENAME_TABLE));
       break;
     case RENAME_COLUMN:
-      if (existColumnName(qualifiedName, alterTable.getNewColumnName())) {
-        throw new 
ColumnNameAlreadyExistException(alterTable.getNewColumnName());
+      if (ensureColumnExistance(qualifiedName, alterTable.getNewColumnName())) 
{
+        throw new DuplicateColumnException(alterTable.getNewColumnName());
       }
       catalog.alterTable(CatalogUtil.renameColumn(qualifiedName, 
alterTable.getColumnName(),
           alterTable.getNewColumnName(), AlterTableType.RENAME_COLUMN));
       break;
     case ADD_COLUMN:
-      if (existColumnName(qualifiedName, 
alterTable.getAddNewColumn().getSimpleName())) {
-        throw new 
ColumnNameAlreadyExistException(alterTable.getAddNewColumn().getSimpleName());
+      if (ensureColumnExistance(qualifiedName, 
alterTable.getAddNewColumn().getSimpleName())) {
+        throw new 
DuplicateColumnException(alterTable.getAddNewColumn().getSimpleName());
       }
       catalog.alterTable(CatalogUtil.addNewColumn(qualifiedName, 
alterTable.getAddNewColumn(), AlterTableType.ADD_COLUMN));
       break;
@@ -472,8 +466,18 @@ public class DDLExecutor {
       catalog.alterTable(CatalogUtil.setProperty(qualifiedName, 
alterTable.getProperties(), AlterTableType.SET_PROPERTY));
       break;
     case ADD_PARTITION:
-      if (partitionDescProto != null) {
-        throw new AlreadyExistsPartitionException(tableName, pair.getSecond());
+      pair = 
CatalogUtil.getPartitionKeyNamePair(alterTable.getPartitionColumns(), 
alterTable.getPartitionValues());
+      ensureColumnPartitionKeys(qualifiedName, 
alterTable.getPartitionColumns());
+
+      // checking a duplicated partition
+      boolean duplicatedPartition = true;
+      try {
+        catalog.getPartition(databaseName, simpleTableName, pair.getSecond());
+      } catch (UndefinedPartitionException npe) {
+        duplicatedPartition = false;
+      }
+      if (duplicatedPartition) {
+        throw new DuplicatePartitionException(pair.getSecond());
       }
 
       if (alterTable.getLocation() != null) {
@@ -489,8 +493,7 @@ public class DDLExecutor {
       // If there is a directory which was assumed to be a partitioned 
directory and users don't input another
       // location, this will throw exception.
       Path assumedDirectory = new Path(desc.getUri().toString(), 
pair.getSecond());
-      boolean result1 = fs.exists(assumedDirectory);
-      boolean result2 = fs.exists(partitionPath);
+
       if (fs.exists(assumedDirectory) && 
!assumedDirectory.equals(partitionPath)) {
         throw new 
AlreadyExistsAssumedPartitionDirectoryException(assumedDirectory.toString());
       }
@@ -504,6 +507,10 @@ public class DDLExecutor {
       }
       break;
     case DROP_PARTITION:
+      ensureColumnPartitionKeys(qualifiedName, 
alterTable.getPartitionColumns());
+      pair = 
CatalogUtil.getPartitionKeyNamePair(alterTable.getPartitionColumns(), 
alterTable.getPartitionValues());
+      partitionDescProto = catalog.getPartition(databaseName, simpleTableName, 
pair.getSecond());
+
       if (partitionDescProto == null) {
         throw new NoSuchPartitionException(tableName, pair.getSecond());
       }
@@ -535,16 +542,16 @@ public class DDLExecutor {
     }
   }
 
-  private boolean existPartitionColumnNames(String tableName, String[] 
columnNames) {
+  private boolean ensureColumnPartitionKeys(String tableName, String[] 
columnNames) {
     for(String columnName : columnNames) {
-      if (!existPartitionColumnName(tableName, columnName)) {
+      if (!ensureColumnPartitionKeys(tableName, columnName)) {
         throw new NoSuchPartitionKeyException(tableName, columnName);
       }
     }
     return true;
   }
 
-  private boolean existPartitionColumnName(String tableName, String 
columnName) {
+  private boolean ensureColumnPartitionKeys(String tableName, String 
columnName) {
     final TableDesc tableDesc = catalog.getTableDesc(tableName);
     if 
(tableDesc.getPartitionMethod().getExpressionSchema().contains(columnName)) {
       return true;
@@ -553,8 +560,8 @@ public class DDLExecutor {
     }
   }
 
-  private boolean existColumnName(String tableName, String columnName) {
+  private boolean ensureColumnExistance(String tableName, String columnName) {
     final TableDesc tableDesc = catalog.getTableDesc(tableName);
-    return tableDesc.getSchema().containsByName(columnName) ? true : false;
+    return tableDesc.getSchema().containsByName(columnName);
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java 
b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
index 5d42157..d3530a0 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
@@ -71,6 +71,9 @@ import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.apache.tajo.exception.ReturnStateUtil.errUndefinedDatabase;
+import static org.apache.tajo.exception.ReturnStateUtil.OK;
+
 public class QueryExecutor {
   private static final Log LOG = LogFactory.getLog(QueryExecutor.class);
 
@@ -106,7 +109,7 @@ public class QueryExecutor {
       context.getSystemMetrics().counter("Query", "numDDLQuery").inc();
       ddlExecutor.execute(queryContext, plan);
       response.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
-      response.setResultCode(ClientProtos.ResultCode.OK);
+      response.setState(OK);
 
 
     } else if (plan.isExplain()) { // explain query
@@ -146,8 +149,7 @@ public class QueryExecutor {
         session.selectDatabase(setSessionNode.getValue());
       } else {
         response.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
-        response.setResultCode(ClientProtos.ResultCode.ERROR);
-        response.setErrorMessage("database \"" + databaseName + "\" does not 
exists.");
+        response.setState(errUndefinedDatabase(databaseName));
       }
 
       // others
@@ -161,7 +163,7 @@ public class QueryExecutor {
 
     context.getSystemMetrics().counter("Query", "numDDLQuery").inc();
     response.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
-    response.setResultCode(ClientProtos.ResultCode.OK);
+    response.setState(OK);
   }
 
   public void execExplain(LogicalPlan plan, QueryContext queryContext, boolean 
isGlobal,
@@ -204,9 +206,9 @@ public class QueryExecutor {
     serializedResBuilder.setSchema(schema.getProto());
     serializedResBuilder.setBytesNum(bytesNum);
 
+    response.setState(OK);
     response.setResultSet(serializedResBuilder.build());
     response.setMaxRowNum(lines.length);
-    response.setResultCode(ClientProtos.ResultCode.OK);
     response.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
   }
 
@@ -225,10 +227,10 @@ public class QueryExecutor {
     queryResultScanner.init();
     session.addNonForwardQueryResultScanner(queryResultScanner);
 
+    response.setState(OK);
     response.setQueryId(queryId.getProto());
     response.setMaxRowNum(maxRow);
     response.setTableDesc(queryResultScanner.getTableDesc().getProto());
-    response.setResultCode(ClientProtos.ResultCode.OK);
   }
 
   public void execSimpleQuery(QueryContext queryContext, Session session, 
String query, LogicalPlan plan,
@@ -261,10 +263,10 @@ public class QueryExecutor {
     queryResultScanner.init();
     session.addNonForwardQueryResultScanner(queryResultScanner);
 
+    response.setState(OK);
     response.setQueryId(queryInfo.getQueryId().getProto());
     response.setMaxRowNum(maxRow);
     response.setTableDesc(desc.getProto());
-    response.setResultCode(ClientProtos.ResultCode.OK);
   }
 
   public void execNonFromQuery(QueryContext queryContext, LogicalPlan plan, 
SubmitQueryResponse.Builder responseBuilder)
@@ -298,10 +300,10 @@ public class QueryExecutor {
         serializedResBuilder.setSchema(schema.getProto());
         serializedResBuilder.setBytesNum(serializedBytes.length);
 
+        responseBuilder.setState(OK);
         responseBuilder.setResultSet(serializedResBuilder);
         responseBuilder.setMaxRowNum(1);
         responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
-        responseBuilder.setResultCode(ClientProtos.ResultCode.OK);
       }
     } finally {
       // stop script executor
@@ -463,7 +465,7 @@ public class QueryExecutor {
       // If queryId == NULL_QUERY_ID and MaxRowNum == -1, TajoCli prints only 
number of inserted rows.
       responseBuilder.setMaxRowNum(-1);
       responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
-      responseBuilder.setResultCode(ClientProtos.ResultCode.OK);
+      responseBuilder.setState(OK);
     } catch (Throwable t) {
       throw new RuntimeException(t);
     }
@@ -497,22 +499,15 @@ public class QueryExecutor {
 
     queryInfo = queryManager.scheduleQuery(session, queryContext, sql, 
jsonExpr, rootNode);
 
-    if(queryInfo == null) {
-      responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
-      responseBuilder.setResultCode(ClientProtos.ResultCode.ERROR);
-      responseBuilder.setErrorMessage("Fail starting QueryMaster.");
-      LOG.error("Fail starting QueryMaster: " + sql);
-    } else {
-      responseBuilder.setIsForwarded(true);
-      responseBuilder.setQueryId(queryInfo.getQueryId().getProto());
-      responseBuilder.setResultCode(ClientProtos.ResultCode.OK);
-      if(queryInfo.getQueryMasterHost() != null) {
-        responseBuilder.setQueryMasterHost(queryInfo.getQueryMasterHost());
-      }
-      responseBuilder.setQueryMasterPort(queryInfo.getQueryMasterClientPort());
-      LOG.info("Query " + queryInfo.getQueryId().toString() + "," + 
queryInfo.getSql() + "," +
-          " is forwarded to " + queryInfo.getQueryMasterHost() + ":" + 
queryInfo.getQueryMasterPort());
+    responseBuilder.setIsForwarded(true);
+    responseBuilder.setQueryId(queryInfo.getQueryId().getProto());
+    responseBuilder.setState(OK);
+    if (queryInfo.getQueryMasterHost() != null) {
+      responseBuilder.setQueryMasterHost(queryInfo.getQueryMasterHost());
     }
+    responseBuilder.setQueryMasterPort(queryInfo.getQueryMasterClientPort());
+    LOG.info("Query " + queryInfo.getQueryId().toString() + "," + 
queryInfo.getSql() + "," +
+        " is forwarded to " + queryInfo.getQueryMasterHost() + ":" + 
queryInfo.getQueryMasterPort());
   }
 
   public MasterPlan compileMasterPlan(LogicalPlan plan, QueryContext context, 
GlobalPlanner planner)

http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/session/NoSuchSessionVariableException.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/session/NoSuchSessionVariableException.java
 
b/tajo-core/src/main/java/org/apache/tajo/session/NoSuchSessionVariableException.java
index be90449..a941b55 100644
--- 
a/tajo-core/src/main/java/org/apache/tajo/session/NoSuchSessionVariableException.java
+++ 
b/tajo-core/src/main/java/org/apache/tajo/session/NoSuchSessionVariableException.java
@@ -18,8 +18,12 @@
 
 package org.apache.tajo.session;
 
-public class NoSuchSessionVariableException extends Exception {
+import org.apache.tajo.error.Errors;
+import org.apache.tajo.exception.TajoException;
+
+public class NoSuchSessionVariableException extends TajoException {
+
   public NoSuchSessionVariableException(String varname) {
-    super("No such session variable \"" + varname + "\"");
+    super(Errors.ResultCode.NO_SUCH_SESSION_VARIABLE, varname);
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java 
b/tajo-core/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java
index ae22d0d..1df8e7a 100644
--- a/tajo-core/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java
+++ b/tajo-core/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java
@@ -1,6 +1,5 @@
 package org.apache.tajo.webapp;
 
-import com.google.protobuf.ServiceException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.util.StringUtils;
@@ -9,10 +8,7 @@ import org.apache.tajo.QueryIdFactory;
 import org.apache.tajo.TajoProtos;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.TableDesc;
-import org.apache.tajo.client.QueryStatus;
-import org.apache.tajo.client.TajoClient;
-import org.apache.tajo.client.TajoClientImpl;
-import org.apache.tajo.client.TajoClientUtil;
+import org.apache.tajo.client.*;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.ipc.ClientProtos;
 import org.apache.tajo.jdbc.FetchResultSet;
@@ -43,6 +39,9 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import static org.apache.tajo.exception.ReturnStateUtil.isError;
+import static org.apache.tajo.exception.ReturnStateUtil.isSuccess;
+
 /**
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -94,7 +93,7 @@ public class QueryExecutorServlet extends HttpServlet {
       tajoClient = new TajoClientImpl(ServiceTrackerFactory.get(tajoConf));
 
       new QueryRunnerCleaner().start();
-    } catch (IOException e) {
+    } catch (Throwable e) {
       LOG.error(e.getMessage(), e);
     }
   }
@@ -320,7 +319,7 @@ public class QueryExecutorServlet extends HttpServlet {
           LOG.error("Internal Error: SubmissionResponse is NULL");
           error = new Exception("Internal Error: SubmissionResponse is NULL");
 
-        } else if (response.getResultCode() == ClientProtos.ResultCode.OK) {
+        } else if (isSuccess(response.getState())) {
           if (response.getIsForwarded()) {
             queryId = new QueryId(response.getQueryId());
             getQueryResult(queryId);
@@ -332,22 +331,20 @@ public class QueryExecutorServlet extends HttpServlet {
 
             progress.set(100);
           }
-        } else if (response.getResultCode() == ClientProtos.ResultCode.ERROR) {
-          if (response.hasErrorMessage()) {
-            StringBuffer errorMessage = new 
StringBuffer(response.getErrorMessage());
-            String modifiedMessage;
+        } else if (isError(response.getState())) {
+          StringBuffer errorMessage = new 
StringBuffer(response.getState().getMessage());
+          String modifiedMessage;
 
-            if (errorMessage.length() > 200) {
-              modifiedMessage = errorMessage.substring(0, 200);
-            } else {
-              modifiedMessage = errorMessage.toString();
-            }
-            
-            String lineSeparator = System.getProperty("line.separator");
-            modifiedMessage = modifiedMessage.replaceAll(lineSeparator, 
"<br/>");
-
-            error = new Exception(modifiedMessage);
+          if (errorMessage.length() > 200) {
+            modifiedMessage = errorMessage.substring(0, 200);
+          } else {
+            modifiedMessage = errorMessage.toString();
           }
+
+          String lineSeparator = System.getProperty("line.separator");
+          modifiedMessage = modifiedMessage.replaceAll(lineSeparator, "<br/>");
+
+          error = new Exception(modifiedMessage);
         }
       } catch (Exception e) {
         LOG.error(e.getMessage(), e);
@@ -358,7 +355,11 @@ public class QueryExecutorServlet extends HttpServlet {
         finishTime = System.currentTimeMillis();
 
         if (queryId != null) {
-          tajoClient.closeQuery(queryId);
+          try {
+            tajoClient.closeQuery(queryId);
+          } catch (SQLException e) {
+            LOG.warn(e);
+          }
         }
       }
     }
@@ -390,7 +391,7 @@ public class QueryExecutorServlet extends HttpServlet {
       }
     }
 
-    private QueryStatus waitForComplete(QueryId queryid) throws 
ServiceException {
+    private QueryStatus waitForComplete(QueryId queryid) throws SQLException {
       QueryStatus status = null;
 
       while (!stop.get()) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/worker/TajoWorkerClientService.java
----------------------------------------------------------------------
diff --git 
a/tajo-core/src/main/java/org/apache/tajo/worker/TajoWorkerClientService.java 
b/tajo-core/src/main/java/org/apache/tajo/worker/TajoWorkerClientService.java
index c0a6453..edb5703 100644
--- 
a/tajo-core/src/main/java/org/apache/tajo/worker/TajoWorkerClientService.java
+++ 
b/tajo-core/src/main/java/org/apache/tajo/worker/TajoWorkerClientService.java
@@ -26,10 +26,10 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.service.AbstractService;
 import org.apache.tajo.QueryId;
+import org.apache.tajo.exception.ReturnStateUtil;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.ipc.ClientProtos.GetQueryHistoryResponse;
 import org.apache.tajo.ipc.ClientProtos.QueryIdRequest;
-import org.apache.tajo.ipc.ClientProtos.ResultCode;
 import org.apache.tajo.ipc.QueryMasterClientProtocol;
 import org.apache.tajo.querymaster.QueryMasterTask;
 import org.apache.tajo.rpc.BlockingRpcServer;
@@ -129,11 +129,10 @@ public class TajoWorkerClientService extends 
AbstractService {
         if (queryHistory != null) {
           builder.setQueryHistory(queryHistory.getProto());
         }
-        builder.setResultCode(ResultCode.OK);
+        builder.setState(ReturnStateUtil.OK);
       } catch (Throwable t) {
-        LOG.warn(t.getMessage(), t);
-        builder.setResultCode(ResultCode.ERROR);
-        
builder.setErrorMessage(org.apache.hadoop.util.StringUtils.stringifyException(t));
+        LOG.error(t.getMessage(), t);
+        builder.setState(ReturnStateUtil.returnError(t));
       }
 
       return builder.build();

Reply via email to