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/06/24 04:24:01 UTC

[8/8] tajo git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/tajo into index_support

Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/tajo into index_support

Conflicts:
	CHANGES
	tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java
	tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java


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

Branch: refs/heads/index_support
Commit: 00a8c658e2798dfd41fb263edf365cfadc9fd2d7
Parents: f674fa8 b24d18f
Author: Jihoon Son <ji...@apache.org>
Authored: Wed Jun 24 11:23:42 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Wed Jun 24 11:23:42 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |  16 ++
 .../tajo/catalog/store/AbstractDBStore.java     |  33 ++-
 .../catalog/store/XMLCatalogSchemaManager.java  |  30 ++
 .../tajo/client/CatalogAdminClientImpl.java     | 154 +----------
 .../org/apache/tajo/client/QueryClientImpl.java |  20 +-
 .../apache/tajo/client/SessionConnection.java   |  18 +-
 .../java/org/apache/tajo/client/TajoClient.java |   3 +
 .../org/apache/tajo/client/TajoClientUtil.java  |  21 +-
 .../org/apache/tajo/jdbc/FetchResultSet.java    |  15 +-
 .../apache/tajo/jdbc/TajoMemoryResultSet.java   |  10 +-
 .../org/apache/tajo/jdbc/TajoResultSetBase.java |  19 +-
 .../org/apache/tajo/jdbc/WaitingResultSet.java  |  71 +++++
 tajo-client/src/main/proto/ClientProtos.proto   |  16 +-
 .../main/proto/TajoMasterClientProtocol.proto   |   8 +-
 .../java/org/apache/tajo/OverridableConf.java   |   4 +
 .../src/main/java/org/apache/tajo/QueryId.java  |   4 +
 .../main/java/org/apache/tajo/SessionVars.java  |   4 +-
 .../java/org/apache/tajo/conf/TajoConf.java     |   1 +
 .../java/org/apache/tajo/util/KeyValueSet.java  |  59 +++-
 .../planner/physical/BSTIndexScanExec.java      |   5 -
 .../org/apache/tajo/master/QueryInProgress.java |  10 +-
 .../tajo/master/TajoMasterClientService.java    |  62 +++--
 .../apache/tajo/querymaster/Repartitioner.java  |   4 +-
 .../tajo/ws/rs/resources/FunctionsResource.java |  41 +--
 .../tajo/ws/rs/resources/QueryResource.java     |   9 +-
 .../ws/rs/resources/QueryResultResource.java    |   2 +-
 .../java/org/apache/tajo/jdbc/TestTajoJdbc.java |  37 ++-
 .../ws/rs/resources/TestFunctionsResource.java  |  18 +-
 .../TestTajoCli/testHelpSessionVars.result      |   1 +
 tajo-dist/pom.xml                               |   2 +
 tajo-dist/src/main/bin/tajo                     |   3 +
 .../org/apache/tajo/jdbc/JdbcConnection.java    |   6 +-
 .../apache/tajo/jdbc/TajoMetaDataResultSet.java |   9 +-
 .../apache/tajo/jdbc/TajoPreparedStatement.java | 276 ++-----------------
 .../org/apache/tajo/jdbc/TajoStatement.java     | 199 ++++++++-----
 35 files changed, 539 insertions(+), 651 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/CHANGES
----------------------------------------------------------------------
diff --cc CHANGES
index f883771,170b928..32e07b1
--- a/CHANGES
+++ b/CHANGES
@@@ -154,10 -162,14 +162,18 @@@ Release 0.11.0 - unrelease
  
    BUG FIXES
  
 +    TAJO-1608: Fix test failure in index_support branch. (jihoon)
 +
 +    TAJO-1594: Catalog schema is invalid for some databases. (jihoon)
 +
+     TAJO-1642: CatalogServer need to check meta table first. (jaehwa)
+ 
+     TAJO-1650: TestQueryResource.testGetAllQueries() occasionally fails.
+     (Contributed by jinho, Committed by jaehwa)
+  
+     TAJO-1634: REST API: fix error when offset is zero.
+     (Contributed by DaeMyung Kang, Committed by jaehwa)
+ 
      TAJO-1630: Test failure after TAJO-1130. (jihoon)
  
      TAJO-1623: INSERT INTO with wrong target columns causes NPE. (hyunsik)

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/AbstractDBStore.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java
----------------------------------------------------------------------
diff --cc tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java
index 5a04892,1fe856a..e6566dc
--- a/tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/CatalogAdminClientImpl.java
@@@ -20,15 -20,17 +20,18 @@@ package org.apache.tajo.client
  
  import com.google.protobuf.ServiceException;
  import org.apache.tajo.annotation.Nullable;
- import org.apache.tajo.catalog.*;
+ import org.apache.tajo.catalog.CatalogUtil;
+ import org.apache.tajo.catalog.Schema;
+ import org.apache.tajo.catalog.TableDesc;
+ import org.apache.tajo.catalog.TableMeta;
  import org.apache.tajo.catalog.partition.PartitionMethodDesc;
  import org.apache.tajo.catalog.proto.CatalogProtos;
 +import org.apache.tajo.catalog.proto.CatalogProtos.IndexDescProto;
  import org.apache.tajo.ipc.ClientProtos;
 -import org.apache.tajo.ipc.ClientProtos.SessionedStringProto;
 +import org.apache.tajo.ipc.ClientProtos.*;
- import org.apache.tajo.ipc.TajoMasterClientProtocol;
  import org.apache.tajo.jdbc.SQLStates;
  import org.apache.tajo.rpc.NettyClientBase;
+ import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos;
  
  import java.io.IOException;
  import java.net.URI;
@@@ -111,43 -113,11 +114,11 @@@ public class CatalogAdminClientImpl imp
        builder.setPartition(partitionMethodDesc.getProto());
      }
      ClientProtos.TableResponse res = tajoMasterService.createExternalTable(null, builder.build());
 -    if (res.getResultCode() == ClientProtos.ResultCode.OK) {
 +    if (res.getResult().getResultCode() == ClientProtos.ResultCode.OK) {
        return CatalogUtil.newTableDesc(res.getTableDesc());
      } else {
 -      throw new SQLException(res.getErrorMessage(), SQLStates.ER_NO_SUCH_TABLE.getState());
 +      throw new SQLException(res.getResult().getErrorMessage(), SQLStates.ER_NO_SUCH_TABLE.getState());
      }
- 
- //<<<<<<< HEAD
- //    return new ServerCallable<TableDesc>(connection.manager, connection.getTajoMasterAddr(),
- //        TajoMasterClientProtocol.class, false) {
- //
- //      public TableDesc call(NettyClientBase client) throws ServiceException, SQLException {
- //
- //
- //      }
- //
- //    }.withRetries();
- //=======
- //    NettyClientBase client = connection.getTajoMasterConnection();
- //    connection.checkSessionAndGet(client);
- //    BlockingInterface tajoMasterService = client.getStub();
- //
- //    ClientProtos.CreateTableRequest.Builder builder = ClientProtos.CreateTableRequest.newBuilder();
- //    builder.setSessionId(connection.sessionId);
- //    builder.setName(tableName);
- //    builder.setSchema(schema.getProto());
- //    builder.setMeta(meta.getProto());
- //    builder.setPath(path.toString());
- //    if (partitionMethodDesc != null) {
- //      builder.setPartition(partitionMethodDesc.getProto());
- //    }
- //    ClientProtos.TableResponse res = tajoMasterService.createExternalTable(null, builder.build());
- //    if (res.getResultCode() == ClientProtos.ResultCode.OK) {
- //      return CatalogUtil.newTableDesc(res.getTableDesc());
- //    } else {
- //      throw new SQLException(res.getErrorMessage(), SQLStates.ER_NO_SUCH_TABLE.getState());
- //    }
- //>>>>>>> 9b3824b5f0c64af42bfcf0a6bb8d3555c22c5746
    }
  
    @Override
@@@ -192,42 -163,15 +163,16 @@@
      connection.checkSessionAndGet(client);
      BlockingInterface tajoMasterService = client.getStub();
  
-     ClientProtos.GetTableDescRequest.Builder builder = ClientProtos.GetTableDescRequest.newBuilder();
+     SessionedStringProto.Builder builder = SessionedStringProto.newBuilder();
      builder.setSessionId(connection.sessionId);
-     builder.setTableName(tableName);
+     builder.setValue(tableName);
      ClientProtos.TableResponse res = tajoMasterService.getTableDesc(null, builder.build());
 -    if (res.getResultCode() == ClientProtos.ResultCode.OK) {
 +    if (res.getResult().getResultCode() == ClientProtos.ResultCode.OK) {
        return CatalogUtil.newTableDesc(res.getTableDesc());
      } else {
 -      throw new ServiceException(new SQLException(res.getErrorMessage(), SQLStates.ER_NO_SUCH_TABLE.getState()));
 +      throw new ServiceException(new SQLException(res.getResult().getErrorMessage(),
 +          SQLStates.ER_NO_SUCH_TABLE.getState()));
      }
- 
- //<<<<<<< HEAD
- //    return new ServerCallable<TableDesc>(connection.manager, connection.getTajoMasterAddr(),
- //        TajoMasterClientProtocol.class, false) {
- //
- //      public TableDesc call(NettyClientBase client) throws ServiceException, SQLException {
- //
- //
- //      }
- //
- //    }.withRetries();
- //=======
- //    NettyClientBase client = connection.getTajoMasterConnection();
- //    connection.checkSessionAndGet(client);
- //    BlockingInterface tajoMasterService = client.getStub();
- //
- //    ClientProtos.GetTableDescRequest.Builder builder = ClientProtos.GetTableDescRequest.newBuilder();
- //    builder.setSessionId(connection.sessionId);
- //    builder.setTableName(tableName);
- //    ClientProtos.TableResponse res = tajoMasterService.getTableDesc(null, builder.build());
- //    if (res.getResultCode() == ClientProtos.ResultCode.OK) {
- //      return CatalogUtil.newTableDesc(res.getTableDesc());
- //    } else {
- //      throw new ServiceException(new SQLException(res.getErrorMessage(), SQLStates.ER_NO_SUCH_TABLE.getState()));
- //    }
- //>>>>>>> 9b3824b5f0c64af42bfcf0a6bb8d3555c22c5746
    }
  
    @Override
@@@ -239,171 -184,11 +184,94 @@@
      String paramFunctionName = functionName == null ? "" : functionName;
      ClientProtos.FunctionResponse res = tajoMasterService.getFunctionList(null,
          connection.convertSessionedString(paramFunctionName));
 -    if (res.getResultCode() == ClientProtos.ResultCode.OK) {
 +    if (res.getResult().getResultCode() == ClientProtos.ResultCode.OK) {
        return res.getFunctionsList();
      } else {
 -      throw new ServiceException(new SQLException(res.getErrorMessage()));
 +      throw new ServiceException(res.getResult().getErrorMessage());
 +    }
- 
- //<<<<<<< HEAD
- //    return new ServerCallable<List<CatalogProtos.FunctionDescProto>>(connection.manager,
- //        connection.getTajoMasterAddr(), TajoMasterClientProtocol.class, false) {
- //
- //      public List<CatalogProtos.FunctionDescProto> call(NettyClientBase client) throws ServiceException, SQLException {
- //
- //
- //      }
- //
- //    }.withRetries();
- //=======
- //    NettyClientBase client = connection.getTajoMasterConnection();
- //    connection.checkSessionAndGet(client);
- //    BlockingInterface tajoMasterService = client.getStub();
- //
- //    String paramFunctionName = functionName == null ? "" : functionName;
- //    ClientProtos.FunctionResponse res = tajoMasterService.getFunctionList(null,
- //        connection.convertSessionedString(paramFunctionName));
- //    if (res.getResultCode() == ClientProtos.ResultCode.OK) {
- //      return res.getFunctionsList();
- //    } else {
- //      throw new ServiceException(new SQLException(res.getErrorMessage()));
- //    }
- //>>>>>>> 9b3824b5f0c64af42bfcf0a6bb8d3555c22c5746
 +  }
 +
 +  @Override
 +  public IndexDescProto getIndex(final String indexName) throws ServiceException {
 +    NettyClientBase client = connection.getTajoMasterConnection();
 +    connection.checkSessionAndGet(client);
 +    BlockingInterface tajoMasterService = client.getStub();
 +    return tajoMasterService.getIndexWithName(null,
 +        connection.convertSessionedString(indexName));
 +  }
 +
 +  @Override
 +  public boolean existIndex(final String indexName) throws ServiceException {
 +    NettyClientBase client = connection.getTajoMasterConnection();
 +    connection.checkSessionAndGet(client);
 +    BlockingInterface tajoMasterService = client.getStub();
 +    return tajoMasterService.existIndexWithName(null,
 +        connection.convertSessionedString(indexName)).getValue();
- //    return new ServerCallable<Boolean>(connection.manager,
- //        connection.getTajoMasterAddr(), TajoMasterClientProtocol.class, false) {
- //
- //      @Override
- //      public Boolean call(NettyClientBase client) throws Exception {
- //
- //      }
- //    }.withRetries();
 +  }
 +
 +  @Override
 +  public List<IndexDescProto> getIndexes(final String tableName) throws ServiceException {
 +    NettyClientBase client = connection.getTajoMasterConnection();
 +    connection.checkSessionAndGet(client);
 +    BlockingInterface tajoMasterService = client.getStub();
 +    GetIndexesResponse response = tajoMasterService.getIndexesForTable(null,
 +        connection.convertSessionedString(tableName));
 +    if (response.getResult().getResultCode() == ResultCode.OK) {
 +      return response.getIndexesList();
 +    } else {
 +      throw new ServiceException(response.getResult().getErrorMessage());
 +    }
- //    return new ServerCallable<List<IndexDescProto>>(connection.manager,
- //        connection.getTajoMasterAddr(), TajoMasterClientProtocol.class, false) {
- //
- //      @Override
- //      public List<IndexDescProto> call(NettyClientBase client) throws Exception {
- //
- //      }
- //    }.withRetries();
 +  }
 +
 +  @Override
 +  public boolean hasIndexes(final String tableName) throws ServiceException {
 +    NettyClientBase client = connection.getTajoMasterConnection();
 +    connection.checkSessionAndGet(client);
 +    BlockingInterface tajoMasterService = client.getStub();
 +    return tajoMasterService.existIndexesForTable(null,
 +        connection.convertSessionedString(tableName)).getValue();
- 
- //    return new ServerCallable<Boolean>(connection.manager,
- //        connection.getTajoMasterAddr(), TajoMasterClientProtocol.class, false) {
- //
- //      @Override
- //      public Boolean call(NettyClientBase client) throws Exception {
- //
- //      }
- //    }.withRetries();
 +  }
 +
 +  @Override
 +  public IndexDescProto getIndex(final String tableName, final String[] columnNames) throws ServiceException {
 +    NettyClientBase client = connection.getTajoMasterConnection();
 +    connection.checkSessionAndGet(client);
 +    BlockingInterface tajoMasterService = client.getStub();
 +    GetIndexWithColumnsRequest.Builder builder = GetIndexWithColumnsRequest.newBuilder();
 +    builder.setSessionId(connection.sessionId);
 +    builder.setTableName(tableName);
 +    for (String eachColumnName : columnNames) {
 +      builder.addColumnNames(eachColumnName);
 +    }
 +    GetIndexWithColumnsResponse response = tajoMasterService.getIndexWithColumns(null, builder.build());
 +    if (response.getResult().getResultCode() == ResultCode.OK) {
 +      return response.getIndexDesc();
 +    } else {
 +      throw new ServiceException(response.getResult().getErrorMessage());
 +    }
- 
- //    return new ServerCallable<IndexDescProto>(connection.manager,
- //        connection.getTajoMasterAddr(), TajoMasterClientProtocol.class, false) {
- //
- //      @Override
- //      public IndexDescProto call(NettyClientBase client) throws Exception {
- //
- //      }
- //    }.withRetries();
 +  }
 +
 +  @Override
 +  public boolean existIndex(final String tableName, final String[] columnName) throws ServiceException {
 +    NettyClientBase client = connection.getTajoMasterConnection();
 +    connection.checkSessionAndGet(client);
 +    BlockingInterface tajoMasterService = client.getStub();
 +    GetIndexWithColumnsRequest.Builder builder = GetIndexWithColumnsRequest.newBuilder();
 +    builder.setSessionId(connection.sessionId);
 +    builder.setTableName(tableName);
 +    for (String eachColumnName : columnName) {
 +      builder.addColumnNames(eachColumnName);
      }
 +    return tajoMasterService.existIndexWithColumns(null, builder.build()).getValue();
- 
- //    return new ServerCallable<Boolean>(connection.manager,
- //        connection.getTajoMasterAddr(), TajoMasterClientProtocol.class, false) {
- //
- //      @Override
- //      public Boolean call(NettyClientBase client) throws Exception {
- //
- //      }
- //    }.withRetries();
 +  }
 +
 +  @Override
 +  public boolean dropIndex(final String indexName) throws ServiceException {
 +    NettyClientBase client = connection.getTajoMasterConnection();
 +    connection.checkSessionAndGet(client);
 +    BlockingInterface tajoMasterService = client.getStub();
 +    return tajoMasterService.dropIndex(null,
 +        connection.convertSessionedString(indexName)).getValue();
- 
- //    return new ServerCallable<Boolean>(connection.manager,
- //        connection.getTajoMasterAddr(), TajoMasterClientProtocol.class, false) {
- //
- //      @Override
- //      public Boolean call(NettyClientBase client) throws Exception {
- //
- //      }
- //    }.withRetries();
    }
  
    @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-client/src/main/java/org/apache/tajo/client/QueryClientImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-client/src/main/proto/ClientProtos.proto
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-client/src/main/proto/TajoMasterClientProtocol.proto
----------------------------------------------------------------------
diff --cc tajo-client/src/main/proto/TajoMasterClientProtocol.proto
index 586f9ab,468a998..9c7755a
--- a/tajo-client/src/main/proto/TajoMasterClientProtocol.proto
+++ b/tajo-client/src/main/proto/TajoMasterClientProtocol.proto
@@@ -65,16 -65,7 +65,16 @@@ service TajoMasterClientProtocolServic
    rpc createExternalTable(CreateTableRequest) returns (TableResponse);
    rpc existTable(SessionedStringProto) returns (BoolProto);
    rpc dropTable(DropTableRequest) returns (BoolProto);
-   rpc getTableList(GetTableListRequest) returns (GetTableListResponse);
-   rpc getTableDesc(GetTableDescRequest) returns (TableResponse);
+   rpc getTableList(SessionedStringProto) returns (StringListProto);
+   rpc getTableDesc(SessionedStringProto) returns (TableResponse);
    rpc getFunctionList(SessionedStringProto) returns (FunctionResponse);
 +
 +  // Index Management APIs
 +  rpc getIndexWithName(SessionedStringProto) returns (IndexDescProto);
 +  rpc existIndexWithName(SessionedStringProto) returns (BoolProto);
 +  rpc getIndexesForTable(SessionedStringProto) returns (GetIndexesResponse);
 +  rpc existIndexesForTable(SessionedStringProto) returns (BoolProto);
 +  rpc getIndexWithColumns(GetIndexWithColumnsRequest) returns (GetIndexWithColumnsResponse);
 +  rpc existIndexWithColumns(GetIndexWithColumnsRequest) returns (BoolProto);
 +  rpc dropIndex(SessionedStringProto) returns (BoolProto);
  }

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-common/src/main/java/org/apache/tajo/OverridableConf.java
----------------------------------------------------------------------
diff --cc tajo-common/src/main/java/org/apache/tajo/OverridableConf.java
index 32d7fe7,c22f054..0062c43
--- a/tajo-common/src/main/java/org/apache/tajo/OverridableConf.java
+++ b/tajo-common/src/main/java/org/apache/tajo/OverridableConf.java
@@@ -173,8 -176,9 +176,9 @@@ public class OverridableConf extends Ke
      }
    }
  
+   @Override
    public float getFloat(ConfigKey key) {
 -    return getLong(key, null);
 +    return getFloat(key, null);
    }
  
    public void put(ConfigKey key, String val) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-common/src/main/java/org/apache/tajo/SessionVars.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java
----------------------------------------------------------------------
diff --cc tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java
index 4ed1313,bc6975a..34e6f5c
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/BSTIndexScanExec.java
@@@ -18,29 -18,17 +18,27 @@@
  
  package org.apache.tajo.engine.planner.physical;
  
 -import org.apache.hadoop.fs.FileSystem;
 +import org.apache.commons.logging.Log;
 +import org.apache.commons.logging.LogFactory;
  import org.apache.hadoop.fs.Path;
  import org.apache.hadoop.io.IOUtils;
 +import org.apache.tajo.catalog.Column;
  import org.apache.tajo.catalog.Schema;
 +import org.apache.tajo.catalog.SortSpec;
 +import org.apache.tajo.catalog.TableMeta;
 +import org.apache.tajo.catalog.proto.CatalogProtos;
 +import org.apache.tajo.catalog.statistics.TableStats;
  import org.apache.tajo.datum.Datum;
  import org.apache.tajo.engine.planner.Projector;
 +import org.apache.tajo.plan.Target;
  import org.apache.tajo.plan.expr.EvalNode;
 -import org.apache.tajo.plan.logical.ScanNode;
 +import org.apache.tajo.plan.expr.EvalTreeUtil;
 +import org.apache.tajo.plan.logical.IndexScanNode;
 +import org.apache.tajo.plan.rewrite.rules.IndexScanInfo.SimplePredicate;
 +import org.apache.tajo.plan.util.PlannerUtil;
  import org.apache.tajo.storage.*;
--import org.apache.tajo.storage.fragment.FileFragment;
- import org.apache.tajo.storage.fragment.FragmentConvertor;
  import org.apache.tajo.storage.index.bst.BSTIndex;
 +import org.apache.tajo.util.TUtil;
  import org.apache.tajo.worker.TaskAttemptContext;
  
  import java.io.IOException;
@@@ -239,13 -119,8 +236,11 @@@ public class BSTIndexScanExec extends P
             return outTuple;
           } else {
             long offset = reader.next();
-            LOG.info("offset: " + offset);
 -           if (offset == -1) return null;
 +           if (offset == -1) {
 +             return null;
 +           }
             else fileScanner.seek(offset);
 +           return null;
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
----------------------------------------------------------------------
diff --cc tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
index 01c5894,31eecdc..c6732b3
--- a/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
@@@ -52,16 -53,13 +54,14 @@@ import org.apache.tajo.plan.LogicalPlan
  import org.apache.tajo.plan.logical.PartitionedTableScanNode;
  import org.apache.tajo.plan.logical.ScanNode;
  import org.apache.tajo.querymaster.QueryJobEvent;
- import org.apache.tajo.master.rm.Worker;
- import org.apache.tajo.master.rm.WorkerResource;
- import org.apache.tajo.session.InvalidSessionException;
- import org.apache.tajo.session.NoSuchSessionVariableException;
- import org.apache.tajo.session.Session;
  import org.apache.tajo.rpc.BlockingRpcServer;
- import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos;
  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.session.Session;
 +import org.apache.tajo.util.IPCUtil;
  import org.apache.tajo.util.KeyValueSet;
  import org.apache.tajo.util.NetUtils;
  import org.apache.tajo.util.ProtoUtil;
@@@ -770,8 -781,16 +772,16 @@@ public class TajoMasterClientService ex
      }
  
      @Override
-     public TableResponse getTableDesc(RpcController controller, GetTableDescRequest request) throws ServiceException {
+     public TableResponse getTableDesc(RpcController controller, SessionedStringProto request) throws ServiceException {
        try {
+ 
+         if (!request.hasValue()) {
+           return TableResponse.newBuilder()
 -              .setResultCode(ResultCode.ERROR)
 -              .setErrorMessage("table name is required.")
 -              .build();
++              .setResult(
++                  IPCUtil.buildRequestResult(ResultCode.ERROR, "table name is required.", null)
++              ).build();
+         }
+ 
          Session session = context.getSessionManager().getSession(request.getSessionId().getId());
  
          String databaseName;
@@@ -792,8 -811,8 +802,8 @@@
                .build();
          } else {
            return TableResponse.newBuilder()
 -              .setResultCode(ResultCode.ERROR)
 -              .setErrorMessage("ERROR: no such a table: " + request.getValue())
 +              .setResult(IPCUtil.buildRequestResult(ResultCode.ERROR,
-                   "ERROR: no such a table: " + request.getTableName(), null))
++                  "ERROR: no such a table: " + request.getValue(), null))
                .build();
          }
        } catch (Throwable t) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResource.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-core/src/test/resources/results/TestTajoCli/testHelpSessionVars.result
----------------------------------------------------------------------
diff --cc tajo-core/src/test/resources/results/TestTajoCli/testHelpSessionVars.result
index 6f48164,137b0de..46c879c
--- a/tajo-core/src/test/resources/results/TestTajoCli/testHelpSessionVars.result
+++ b/tajo-core/src/test/resources/results/TestTajoCli/testHelpSessionVars.result
@@@ -35,8 -35,7 +35,9 @@@ Available Session Variables
  \set MAX_OUTPUT_FILE_SIZE [int value] - Maximum per-output file size (mb). 0 means infinite.
  \set NULL_CHAR [text value] - null char of text file output
  \set CODEGEN [true or false] - Runtime code generation enabled (experiment)
 +\set INDEX_ENABLED [true or false] - index scan enabled
 +\set INDEX_SELECTIVITY_THRESHOLD [real value] - the selectivity threshold for index scan
  \set ARITHABORT [true or false] - If true, a running query will be terminated when an overflow or divide-by-zero occurs.
  \set FETCH_ROWNUM [int value] - Sets the number of rows at a time from Master
+ \set BLOCK_ON_RESULT [true or false] - Whether to block result set on query execution
  \set DEBUG_ENABLED [true or false] - (debug only) debug mode enabled

http://git-wip-us.apache.org/repos/asf/tajo/blob/00a8c658/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoStatement.java
----------------------------------------------------------------------
diff --cc tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoStatement.java
index 820e350,0f80ddf..e1242a9
--- a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoStatement.java
+++ b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoStatement.java
@@@ -128,6 -154,46 +154,46 @@@ public class TajoStatement implements S
      }
    }
  
+   protected ResultSet executeSQL(String sql) throws SQLException, ServiceException, IOException {
+     if (isSetVariableQuery(sql)) {
+       return setSessionVariable(tajoClient, sql);
+     }
+     if (isUnSetVariableQuery(sql)) {
+       return unSetSessionVariable(tajoClient, sql);
+     }
+ 
+     ClientProtos.SubmitQueryResponse response = tajoClient.executeQuery(sql);
 -    if (response.getResultCode() == ClientProtos.ResultCode.ERROR) {
 -      if (response.hasErrorMessage()) {
 -        throw new ServiceException(response.getErrorMessage());
++    if (response.getResult().getResultCode() == ClientProtos.ResultCode.ERROR) {
++      if (response.getResult().hasErrorMessage()) {
++        throw new ServiceException(response.getResult().getErrorMessage());
+       }
 -      if (response.hasErrorTrace()) {
 -        throw new ServiceException(response.getErrorTrace());
++      if (response.getResult().hasErrorTrace()) {
++        throw new ServiceException(response.getResult().getErrorTrace());
+       }
+       throw new ServiceException("Failed to submit query by unknown reason");
+     }
+ 
+     QueryId queryId = new QueryId(response.getQueryId());
+     if (response.getIsForwarded() && !queryId.isNull()) {
+       WaitingResultSet result = new WaitingResultSet(tajoClient, queryId, fetchSize);
+       if (blockWait) {
+         result.getSchema();
+       }
+       return result;
+     }
+ 
+     if (response.hasResultSet() || response.hasTableDesc()) {
+       return TajoClientUtil.createResultSet(tajoClient, response, fetchSize);
+     }
+     return TajoClientUtil.createNullResultSet(queryId);
+   }
+ 
+   protected void checkConnection(String errorMsg) throws SQLException {
+     if (isClosed) {
+       throw new SQLException(errorMsg + " after statement has been closed");
+     }
+   }
+ 
    public static boolean isSetVariableQuery(String sql) {
      if (sql == null || sql.trim().isEmpty()) {
        return false;