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 2014/08/11 10:11:46 UTC

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

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

Conflicts:
	tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
	tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java


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

Branch: refs/heads/index_support
Commit: fa8f037bb5676e9499c23a0f489cf2a448885ddd
Parents: 5c0277f ddfc3f3
Author: Jihoon Son <ji...@apache.org>
Authored: Mon Aug 11 17:11:04 2014 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Mon Aug 11 17:11:04 2014 +0900

----------------------------------------------------------------------
 CHANGES                                         |  33 +-
 .../java/org/apache/tajo/catalog/TableMeta.java |  14 +-
 .../apache/tajo/catalog/TestKeyValueSet.java    |  83 +++-
 .../tajo/catalog/store/HCatalogStore.java       |  28 +-
 .../tajo/catalog/store/TestHCatalogStore.java   |  12 +-
 .../org/apache/tajo/catalog/TestCatalog.java    |  10 +-
 .../tajo/cli/DefaultTajoCliOutputFormatter.java |  16 +-
 .../java/org/apache/tajo/cli/HelpCommand.java   | 100 ++---
 .../java/org/apache/tajo/cli/SetCommand.java    |  78 +++-
 .../main/java/org/apache/tajo/cli/TajoCli.java  | 152 +++++---
 .../apache/tajo/cli/TajoCliOutputFormatter.java |   5 +-
 .../org/apache/tajo/cli/TajoGetConfCommand.java |  57 +++
 .../org/apache/tajo/cli/TajoShellCommand.java   |  10 +-
 .../java/org/apache/tajo/client/TajoAdmin.java  |  16 +
 .../org/apache/tajo/client/TajoGetConf.java     | 171 +++++++++
 .../main/java/org/apache/tajo/ConfigKey.java    |  52 +++
 .../java/org/apache/tajo/OverridableConf.java   | 235 ++++++++++++
 .../main/java/org/apache/tajo/SessionVars.java  | 211 +++++++++++
 .../java/org/apache/tajo/conf/TajoConf.java     | 204 +++++-----
 .../main/java/org/apache/tajo/datum/Datum.java  |  72 ++++
 .../java/org/apache/tajo/datum/Float4Datum.java |  60 ++-
 .../java/org/apache/tajo/datum/Float8Datum.java |  78 +++-
 .../java/org/apache/tajo/datum/Int2Datum.java   |  76 +++-
 .../java/org/apache/tajo/datum/Int4Datum.java   |  78 +++-
 .../java/org/apache/tajo/datum/Int8Datum.java   |  78 +++-
 .../org/apache/tajo/datum/IntervalDatum.java    |  16 +-
 .../java/org/apache/tajo/datum/NullDatum.java   |   1 +
 .../java/org/apache/tajo/util/BytesUtils.java   |  35 ++
 .../java/org/apache/tajo/util/KeyValueSet.java  | 149 ++++++--
 .../tajo/datum/TestArithmeticOperator.java      | 377 +++++++++++++++++++
 .../exception/RangeOverflowException.java       |   5 +-
 .../function/builtin/CountValueDistinct.java    |   4 +-
 .../apache/tajo/engine/function/math/Round.java |   2 +-
 .../tajo/engine/function/math/RoundFloat8.java  |  39 +-
 .../tajo/engine/planner/LogicalOptimizer.java   |   9 +-
 .../apache/tajo/engine/planner/LogicalPlan.java |   4 +-
 .../engine/planner/LogicalPlanPreprocessor.java |  18 +-
 .../engine/planner/LogicalPlanVerifier.java     |  12 +-
 .../tajo/engine/planner/LogicalPlanner.java     |  35 +-
 .../engine/planner/PhysicalPlannerImpl.java     |  44 ++-
 .../engine/planner/PreLogicalPlanVerifier.java  |  21 +-
 .../engine/planner/RangePartitionAlgorithm.java |  97 ++---
 .../engine/planner/UniformRangePartition.java   | 259 ++++++++-----
 .../engine/planner/global/GlobalPlanner.java    |  18 +-
 .../planner/physical/ExternalSortExec.java      |   4 +-
 .../engine/planner/physical/StoreTableExec.java |   6 +-
 .../planner/rewrite/ProjectionPushDownRule.java |  10 +
 .../apache/tajo/engine/query/QueryContext.java  | 144 +++----
 .../tajo/engine/query/QueryUnitRequestImpl.java |   3 +-
 .../org/apache/tajo/master/GlobalEngine.java    | 112 +++---
 .../tajo/master/TajoMasterClientService.java    |  34 +-
 .../apache/tajo/master/querymaster/Query.java   |   4 +-
 .../tajo/master/querymaster/QueryMaster.java    |  39 +-
 .../querymaster/QueryMasterManagerService.java  |   7 +-
 .../master/querymaster/QueryMasterTask.java     |   4 +-
 .../tajo/master/querymaster/Repartitioner.java  | 138 +++++--
 .../tajo/master/querymaster/SubQuery.java       |  31 +-
 .../org/apache/tajo/master/session/Session.java |  50 +--
 .../session/SessionLivelinessMonitor.java       |   2 +-
 .../java/org/apache/tajo/worker/FetchImpl.java  |  23 ++
 .../java/org/apache/tajo/worker/Fetcher.java    |  31 +-
 .../tajo/worker/TajoWorkerManagerService.java   |  13 +
 .../main/java/org/apache/tajo/worker/Task.java  |  12 +-
 .../apache/tajo/worker/TaskAttemptContext.java  |  12 +-
 .../java/org/apache/tajo/worker/TaskRunner.java |  21 +-
 .../src/main/proto/TajoWorkerProtocol.proto     |   5 +
 .../resources/webapps/worker/querydetail.jsp    |  10 +
 .../apache/tajo/LocalTajoTestingUtility.java    |   5 +
 .../java/org/apache/tajo/QueryTestCaseBase.java |   2 +-
 .../test/java/org/apache/tajo/TpchTestBase.java |   2 +-
 .../tajo/cli/TestDefaultCliOutputFormatter.java |  47 ++-
 .../java/org/apache/tajo/cli/TestTajoCli.java   | 185 +++++----
 .../org/apache/tajo/client/TestTajoClient.java  |   8 +-
 .../apache/tajo/engine/eval/ExprTestBase.java   |   9 +-
 .../tajo/engine/eval/TestEvalTreeUtil.java      |  16 +-
 .../tajo/engine/function/TestMathFunctions.java |  26 +-
 .../engine/planner/TestLogicalOptimizer.java    |  20 +-
 .../tajo/engine/planner/TestLogicalPlan.java    |   3 +-
 .../tajo/engine/planner/TestLogicalPlanner.java | 138 +++++--
 .../tajo/engine/planner/TestPlannerUtil.java    |   5 +-
 .../planner/TestUniformRangePartition.java      | 159 +++++++-
 .../planner/global/TestBroadcastJoinPlan.java   |  62 +--
 .../planner/physical/TestBNLJoinExec.java       |   9 +-
 .../planner/physical/TestBSTIndexExec.java      |   4 +-
 .../planner/physical/TestExternalSortExec.java  |   4 +-
 .../physical/TestFullOuterHashJoinExec.java     |  24 +-
 .../physical/TestFullOuterMergeJoinExec.java    |  29 +-
 .../planner/physical/TestHashAntiJoinExec.java  |   4 +-
 .../planner/physical/TestHashJoinExec.java      |  19 +-
 .../planner/physical/TestHashSemiJoinExec.java  |   4 +-
 .../physical/TestLeftOuterHashJoinExec.java     |  28 +-
 .../physical/TestLeftOuterNLJoinExec.java       |  25 +-
 .../planner/physical/TestMergeJoinExec.java     |   4 +-
 .../engine/planner/physical/TestNLJoinExec.java |  17 +-
 .../planner/physical/TestPhysicalPlanner.java   | 100 ++---
 .../physical/TestProgressExternalSortExec.java  |   4 +-
 .../physical/TestRightOuterHashJoinExec.java    |  16 +-
 .../physical/TestRightOuterMergeJoinExec.java   |  32 +-
 .../engine/planner/physical/TestSortExec.java   |   4 +-
 .../tajo/engine/query/TestCreateIndex.java      |   5 +-
 .../tajo/engine/query/TestGroupByQuery.java     |  64 ++--
 .../tajo/engine/query/TestJoinBroadcast.java    |   8 +-
 .../apache/tajo/engine/query/TestJoinQuery.java |  90 ++---
 .../tajo/engine/query/TestNullValues.java       |  14 +-
 .../tajo/engine/query/TestSelectQuery.java      |  40 +-
 .../apache/tajo/engine/query/TestSortQuery.java |   8 +-
 .../org/apache/tajo/jdbc/TestResultSet.java     |   2 +-
 .../tajo/master/TestExecutionBlockCursor.java   |   6 +-
 .../apache/tajo/master/TestGlobalPlanner.java   |   4 +-
 .../apache/tajo/master/TestRepartitioner.java   |  93 ++++-
 .../querymaster/TestQueryUnitStatusUpdate.java  |   2 +-
 .../apache/tajo/worker/TestDeletionService.java |  61 +++
 .../org/apache/tajo/worker/TestFetcher.java     |  29 +-
 .../tajo/worker/TestRangeRetrieverHandler.java  |   8 +-
 .../testDistinctAggregationCaseByCase3.sql      |   8 +
 .../testDistinctAggregationCaseByCase4.sql      |   7 +
 .../TestSelectQuery/testCaseWhenRound.sql       |   8 +
 ...testSelectColumnAliasExistingInRelation3.sql |  19 +
 .../testDistinctAggregationCaseByCase3.result   |   3 +
 .../testDistinctAggregationCaseByCase4.result   |   3 +
 .../TestSelectQuery/testCaseWhenRound.result    |  22 ++
 ...tSelectColumnAliasExistingInRelation3.result |  11 +
 .../TestTajoCli/testHelpSessionVars.result      |  36 ++
 ...estSelectResultWithNullTrueDeprecated.result |   9 +
 .../testStopWhenErrorDeprecated.result          |   6 +
 tajo-dist/src/main/bin/tajo                     |   5 +
 .../java/org/apache/tajo/storage/Appender.java  |   2 +-
 .../java/org/apache/tajo/storage/CSVFile.java   |  11 +-
 .../org/apache/tajo/storage/StorageUtil.java    |  18 +-
 .../org/apache/tajo/storage/avro/AvroUtil.java  |  17 +-
 .../org/apache/tajo/storage/rcfile/RCFile.java  |  10 +-
 .../sequencefile/SequenceFileAppender.java      |  30 +-
 .../sequencefile/SequenceFileScanner.java       |  21 +-
 .../apache/tajo/storage/v2/RCFileScanner.java   |   2 +-
 .../tajo/storage/TestCompressionStorages.java   |  12 +
 .../org/apache/tajo/storage/TestStorages.java   |  13 +
 .../tajo/pullserver/TajoPullServerService.java  |  54 ++-
 137 files changed, 4202 insertions(+), 1362 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/CHANGES
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/TestCatalog.java
----------------------------------------------------------------------

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

http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/engine/planner/LogicalPlanPreprocessor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
----------------------------------------------------------------------
diff --cc tajo-core/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
index 0e2b26c,35df11f..162aed2
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/LogicalPlanner.java
@@@ -1850,57 -1844,6 +1849,57 @@@ public class LogicalPlanner extends Bas
    }
  
    @Override
 +  public LogicalNode visitCreateIndex(PlanContext context, Stack<Expr> stack, CreateIndex createIndex)
 +      throws PlanningException {
 +    stack.push(createIndex);
 +    LogicalNode child = visit(context, stack, createIndex.getChild());
 +    stack.pop();
 +
 +    QueryBlock block = context.queryBlock;
 +    CreateIndexNode createIndexNode = block.getNodeFromExpr(createIndex);
 +    if (CatalogUtil.isFQTableName(createIndex.getIndexName())) {
 +      createIndexNode.setIndexName(createIndex.getIndexName());
 +    } else {
 +      createIndexNode.setIndexName(
-           CatalogUtil.buildFQName(context.session.getCurrentDatabase(), createIndex.getIndexName()));
++          CatalogUtil.buildFQName(context.queryContext.getCurrentDatabase(), createIndex.getIndexName()));
 +    }
 +    createIndexNode.setUnique(createIndex.isUnique());
 +    Sort.SortSpec[] sortSpecs = createIndex.getSortSpecs();
 +    int sortKeyNum = sortSpecs.length;
 +    String[] referNames = new String[sortKeyNum];
 +
 +    ExprNormalizedResult[] normalizedExprList = new ExprNormalizedResult[sortKeyNum];
 +    for (int i = 0; i < sortKeyNum; i++) {
 +      normalizedExprList[i] = normalizer.normalize(context, sortSpecs[i].getKey());
 +    }
 +    for (int i = 0; i < sortKeyNum; i++) {
 +      referNames[i] = block.namedExprsMgr.addExpr(normalizedExprList[i].baseExpr);
 +      block.namedExprsMgr.addNamedExprArray(normalizedExprList[i].aggExprs);
 +      block.namedExprsMgr.addNamedExprArray(normalizedExprList[i].scalarExprs);
 +    }
 +
 +    createIndexNode.setSortSpecs(annotateSortSpecs(block, referNames, sortSpecs));
 +    createIndexNode.setIndexType(IndexMethod.valueOf(createIndex.getMethodSpec().getName().toUpperCase()));
 +
 +    if (createIndex.getParams() != null) {
 +      KeyValueSet keyValueSet = new KeyValueSet();
 +      keyValueSet.putAll(createIndex.getParams());
 +      createIndexNode.setOptions(keyValueSet);
 +    }
 +
 +    createIndexNode.setInSchema(child.getOutSchema());
 +    createIndexNode.setChild(child);
 +    return createIndexNode;
 +  }
 +
 +  @Override
 +  public LogicalNode visitDropIndex(PlanContext context, Stack<Expr> stack, DropIndex dropIndex) {
 +    DropIndexNode dropIndexNode = context.queryBlock.getNodeFromExpr(dropIndex);
 +    dropIndexNode.init(dropIndex.getIndexName(), dropIndex.isIfExists());
 +    return dropIndexNode;
 +  }
 +
 +  @Override
    public LogicalNode visitTruncateTable(PlanContext context, Stack<Expr> stack, TruncateTable truncateTable)
        throws PlanningException {
      TruncateTableNode truncateTableNode = context.queryBlock.getNodeFromExpr(truncateTable);

http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/engine/planner/rewrite/ProjectionPushDownRule.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
----------------------------------------------------------------------
diff --cc tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
index aed2fe6,37a56ba..24637b1
--- a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
@@@ -190,17 -173,10 +176,23 @@@ public class GlobalEngine extends Abstr
  
      if (PlannerUtil.checkIfDDLPlan(rootNode)) {
        context.getSystemMetrics().counter("Query", "numDDLQuery").inc();
 -      updateQuery(queryContext, rootNode.getChild());
 -      responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
 -      responseBuilder.setResultCode(ClientProtos.ResultCode.OK);
++//<<<<<<< HEAD
++//=======
++//      updateQuery(queryContext, rootNode.getChild());
++//      responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
++//      responseBuilder.setResultCode(ClientProtos.ResultCode.OK);
++//>>>>>>> ddfc3f33039ee15ab0a2d3fe5890b9acb40aec3d
 +
 +      if (PlannerUtil.checkIfCreateIndexPlan(rootNode)) {
 +        return createIndex(session, (CreateIndexNode)rootNode.getChild(), queryContext,
 +            plan, sql, jsonExpr, responseBuilder);
 +      } else {
-         updateQuery(session, rootNode.getChild());
++        updateQuery(queryContext, rootNode.getChild());
 +        responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto());
 +        responseBuilder.setResultCode(ClientProtos.ResultCode.OK);
  
 +        return responseBuilder.build();
 +      }
      } else if (plan.isExplain()) { // explain query
        String explainStr = PlannerUtil.buildExplainString(plan.getRootBlock().getRoot());
        Schema schema = new Schema();
@@@ -468,13 -432,8 +460,13 @@@
          return true;
        case TRUNCATE_TABLE:
          TruncateTableNode truncateTable = (TruncateTableNode) root;
-         truncateTable(session, truncateTable);
+         truncateTable(queryContext, truncateTable);
          return true;
 +      case DROP_INDEX:
 +        DropIndexNode dropIndexNode = (DropIndexNode) root;
-         dropIndex(session, dropIndexNode);
++        dropIndex(queryContext, dropIndexNode);
 +        return true;
 +
        default:
          throw new InternalError("updateQuery cannot handle such query: \n" + root.toJson());
      }
@@@ -663,98 -624,6 +657,98 @@@
      }
    }
  
 +  /**
 +   * Create an index for a given table.
 +   * @param session user session
 +   * @param createIndexNode the root of logical plan
 +   */
 +  private SubmitQueryResponse createIndex(final Session session, final CreateIndexNode createIndexNode,
 +                           QueryContext queryContext, LogicalPlan plan,
 +                           String sql, String jsonExpr,
 +                           SubmitQueryResponse.Builder responseBuilder) throws Exception {
 +    SubmitQueryResponse response = null;
 +    final CatalogService catalog = context.getCatalog();
 +    final String dbName = session.getCurrentDatabase();
 +    String indexName = createIndexNode.getIndexName();
 +    if (CatalogUtil.isFQTableName(indexName)) {
 +      indexName = CatalogUtil.splitFQTableName(indexName)[1];
 +    }
 +
 +    boolean exists = catalog.existIndexByName(dbName, indexName);
 +    if (exists) {
 +      if (createIndexNode.isIfNotExists()) {
 +        LOG.info("index \"" + indexName + "\" already exists." );
 +      } else {
 +        throw new AlreadyExistsIndexException(createIndexNode.getIndexName());
 +      }
 +    } else {
 +      response = executeInCluster(queryContext, plan, session, sql, jsonExpr, responseBuilder);
 +
 +      // get the table name and predicate from scan
 +      try {
 +        ScanNode scanNode = PlannerUtil.findTopNode(createIndexNode, NodeType.SCAN);
 +        String tableName;
 +        if (CatalogUtil.isFQTableName(scanNode.getTableName())) {
 +          tableName = CatalogUtil.splitFQTableName(scanNode.getTableName())[1];
 +        } else {
 +          tableName = scanNode.getTableName();
 +        }
 +        String predicate = scanNode.hasQual() ? scanNode.getQual().toJson() : null;
 +        // extract index keys
 +        List<IndexKey> indexKeys = TUtil.newList();
 +        for (SortSpec eachKey : createIndexNode.getSortSpecs()) {
 +          indexKeys.add(new IndexKey(eachKey.getSortKey().toJson(), eachKey.isAscending(), eachKey.isNullFirst()));
 +        }
 +
 +        IndexDesc indexDesc = new IndexDesc(indexName, dbName, tableName, createIndexNode.getIndexType(),
 +            indexKeys, createIndexNode.isUnique(), createIndexNode.isClustered(), predicate);
 +        catalog.createIndex(indexDesc);
 +      } catch (Exception e) {
 +        // delete index
 +        deleteIndexFiles(dbName, indexName);
 +      }
 +    }
 +    return response;
 +  }
 +
 +  /**
 +   * Drop the specified index.
-    * @param session user session
++   * @param queryContext query context
 +   * @param indexName index name
 +   * @param ifExists if exists
 +   */
-   public void dropIndex(final Session session, String indexName, boolean ifExists) {
++  public void dropIndex(final QueryContext queryContext, String indexName, boolean ifExists) {
 +    final CatalogService catalog = context.getCatalog();
-     final String dbName = session.getCurrentDatabase();
++    final String dbName = queryContext.getCurrentDatabase();
 +
 +    boolean exists = catalog.existIndexByName(dbName, indexName);
 +    LOG.info("index name exist: " + exists);
 +    if (!exists) {
 +      if (ifExists) {
 +        LOG.info("index \"" + indexName + "\" does not exist." );
 +      } else {
 +        throw new NoSuchIndexException(indexName);
 +      }
 +    } else {
 +      catalog.dropIndex(dbName, indexName);
 +      deleteIndexFiles(dbName, indexName);
 +    }
 +  }
 +
 +  private void deleteIndexFiles(String dbName, String indexName) {
 +    Path indexPath = new Path(context.getConf().getVar(ConfVars.WAREHOUSE_DIR), dbName + "/" + indexName);
 +    try {
 +      FileSystem fs = indexPath.getFileSystem(context.getConf());
 +      fs.delete(indexPath, true);
 +    } catch (IOException e) {
 +      throw new InternalError(e.getMessage());
 +    }
 +  }
 +
-   private void dropIndex(final Session session, final DropIndexNode dropIndexNode) {
-     dropIndex(session, dropIndexNode.getIndexName(), dropIndexNode.isIfExists());
++  private void dropIndex(final QueryContext queryContext, final DropIndexNode dropIndexNode) {
++    dropIndex(queryContext, dropIndexNode.getIndexName(), dropIndexNode.isIfExists());
 +  }
 +
    private boolean existColumnName(String tableName, String columnName) {
      final TableDesc tableDesc = catalog.getTableDesc(tableName);
      return tableDesc.getSchema().containsByName(columnName) ? true : false;

http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/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 1ac85e3,7d80a88..2f3cbf9
--- a/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java
@@@ -754,42 -770,5 +773,43 @@@ public class TajoMasterClientService ex
          throw new ServiceException(t);
        }
      }
 +
 +    @Override
 +    public BoolProto existIndex(RpcController controller, SessionedStringProto request) throws ServiceException {
 +      try {
 +        Session session = context.getSessionManager().getSession(request.getSessionId().getId());
 +
 +        String databaseName;
 +        String indexName;
 +        if (CatalogUtil.isFQTableName(request.getValue())) {
 +          String [] splitted = CatalogUtil.splitFQTableName(request.getValue());
 +          databaseName = splitted[0];
 +          indexName = splitted[1];
 +        } else {
 +          databaseName = session.getCurrentDatabase();
 +          indexName = request.getValue();
 +        }
 +
 +        if (catalog.existIndexByName(databaseName, indexName)) {
 +          return BOOL_TRUE;
 +        } else {
 +          return BOOL_FALSE;
 +        }
 +      } catch (Throwable e) {
 +        throw new ServiceException(e);
 +      }
 +    }
 +
 +    @Override
 +    public BoolProto dropIndex(RpcController controller, SessionedStringProto request) throws ServiceException {
 +      try {
 +        Session session = context.getSessionManager().getSession(request.getSessionId().getId());
-         context.getGlobalEngine().dropIndex(session, request.getValue(), true);
++        QueryContext queryContext = new QueryContext(conf, session);
++        context.getGlobalEngine().dropIndex(queryContext, request.getValue(), true);
 +        return BOOL_TRUE;
 +      } catch (Throwable t) {
 +        throw new ServiceException(t);
 +      }
 +    }
    }
  }

http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/main/java/org/apache/tajo/worker/TaskAttemptContext.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/test/java/org/apache/tajo/QueryTestCaseBase.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
----------------------------------------------------------------------
diff --cc tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
index 6a6d07c,73f72be..81be5c4
--- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/TestLogicalPlanner.java
@@@ -835,31 -871,11 +870,34 @@@ public class TestLogicalPlanner 
    }
  
    @Test
 +  public final void testCreateIndexNode() throws PlanningException {
++    QueryContext qc = new QueryContext(util.getConfiguration(), session);
 +    Expr expr = sqlAnalyzer.parse(QUERIES[11]);
-     LogicalPlan rootNode = planner.createPlan(session, expr);
++    LogicalPlan rootNode = planner.createPlan(qc, expr);
 +    LogicalNode plan = rootNode.getRootBlock().getRoot();
 +    testJsonSerDerObject(plan);
 +
 +    LogicalRootNode root = (LogicalRootNode) plan;
 +    assertEquals(NodeType.CREATE_INDEX, root.getChild().getType());
 +    CreateIndexNode createIndexNode = root.getChild();
 +
 +    assertEquals(NodeType.PROJECTION, createIndexNode.getChild().getType());
 +    ProjectionNode projNode = createIndexNode.getChild();
 +
 +    assertEquals(NodeType.SELECTION, projNode.getChild().getType());
 +    SelectionNode selNode = projNode.getChild();
 +
 +    assertEquals(NodeType.SCAN, selNode.getChild().getType());
 +    ScanNode scanNode = selNode.getChild();
 +    assertEquals(CatalogUtil.buildFQName(DEFAULT_DATABASE_NAME, "employee"), scanNode.getTableName());
 +  }
 +
 +  @Test
    public final void testAsterisk() throws CloneNotSupportedException, PlanningException {
+     QueryContext qc = new QueryContext(util.getConfiguration(), session);
+ 
      Expr expr = sqlAnalyzer.parse(QUERIES[13]);
-     LogicalPlan planNode = planner.createPlan(session, expr);
+     LogicalPlan planNode = planner.createPlan(qc, expr);
      LogicalNode plan = planNode.getRootBlock().getRoot();
      assertEquals(NodeType.ROOT, plan.getType());
      TestLogicalNode.testCloneLogicalNode(plan);

http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
----------------------------------------------------------------------
diff --cc tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
index 6c36040,a184a9a..072cff3
--- a/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/planner/physical/TestPhysicalPlanner.java
@@@ -797,17 -799,11 +799,17 @@@ public class TestPhysicalPlanner 
      FileFragment[] frags = StorageManager.splitNG(conf, "default.employee", employee.getMeta(), employee.getPath(),
          Integer.MAX_VALUE);
      Path workDir = CommonTestingUtil.getTestDir("target/test-data/testCreateIndex");
 +    Path indexPath = StorageUtil.concatPath(TajoConf.getWarehouseDir(conf), "default/idx_employee");
 +    if (sm.getFileSystem().exists(indexPath)) {
 +      sm.getFileSystem().delete(indexPath, true);
 +    }
 +
-     TaskAttemptContext ctx = new TaskAttemptContext(conf, new QueryContext(),
+     TaskAttemptContext ctx = new TaskAttemptContext(new QueryContext(conf),
          LocalTajoTestingUtility.newQueryUnitAttemptId(masterPlan),
          new FileFragment[] {frags[0]}, workDir);
 +    ctx.setEnforcer(new Enforcer());
      Expr context = analyzer.parse(createIndexStmt[0]);
-     LogicalPlan plan = planner.createPlan(session, context);
+     LogicalPlan plan = planner.createPlan(defaultContext, context);
      LogicalNode rootNode = optimizer.optimize(plan);
  
      PhysicalPlanner phyPlanner = new PhysicalPlannerImpl(conf, sm);

http://git-wip-us.apache.org/repos/asf/tajo/blob/fa8f037b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestCreateIndex.java
----------------------------------------------------------------------
diff --cc tajo-core/src/test/java/org/apache/tajo/engine/query/TestCreateIndex.java
index 4714bd6,0000000..f03ed61
mode 100644,000000..100644
--- a/tajo-core/src/test/java/org/apache/tajo/engine/query/TestCreateIndex.java
+++ b/tajo-core/src/test/java/org/apache/tajo/engine/query/TestCreateIndex.java
@@@ -1,90 -1,0 +1,91 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + *     http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing, software
 + * distributed under the License is distributed on an "AS IS" BASIS,
 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + * See the License for the specific language governing permissions and
 + * limitations under the License.
 + */
 +
 +package org.apache.tajo.engine.query;
 +
 +import com.google.protobuf.ServiceException;
 +import org.apache.hadoop.fs.FileSystem;
 +import org.apache.hadoop.fs.Path;
 +import org.apache.tajo.IntegrationTest;
 +import org.apache.tajo.QueryTestCaseBase;
 +import org.apache.tajo.TajoConstants;
++import org.apache.tajo.conf.TajoConf;
 +import org.apache.tajo.conf.TajoConf.ConfVars;
 +import org.junit.Test;
 +import org.junit.experimental.categories.Category;
 +
 +import java.io.IOException;
 +
 +import static org.junit.Assert.assertEquals;
 +import static org.junit.Assert.assertFalse;
 +import static org.junit.Assert.assertTrue;
 +
 +@Category(IntegrationTest.class)
 +public class TestCreateIndex extends QueryTestCaseBase {
 +
 +  public TestCreateIndex() {
 +    super(TajoConstants.DEFAULT_DATABASE_NAME);
 +  }
 +
 +  private void checkIndexExist(String indexName) throws IOException, ServiceException {
-     Path indexPath = new Path(conf.getVar(ConfVars.WAREHOUSE_DIR), "default/" + indexName);
++    Path indexPath = new Path(TajoConf.getWarehouseDir(conf), "default/" + indexName);
 +    FileSystem fs = indexPath.getFileSystem(conf);
 +    assertTrue(fs.exists(indexPath));
 +    assertEquals(2, fs.listStatus(indexPath).length);
 +    assertIndexExists(indexName);
 +  }
 +
 +  private void checkIndexNotExist(String indexName) throws IOException, ServiceException {
-     Path indexPath = new Path(conf.getVar(ConfVars.WAREHOUSE_DIR), "default/" + indexName);
++    Path indexPath = new Path(TajoConf.getWarehouseDir(conf), "default/" + indexName);
 +    FileSystem fs = indexPath.getFileSystem(conf);
 +    assertFalse(fs.exists(indexPath));
 +    assertIndexNotExists(indexName);
 +  }
 +
 +  @Test
 +  public final void testCreateIndex() throws Exception {
 +    executeQuery();
 +    checkIndexExist("l_orderkey_idx");
 +    executeString("drop index l_orderkey_idx");
 +    checkIndexNotExist("l_orderkey_idx");
 +  }
 +
 +  @Test
 +  public final void testCreateIndexOnMultiAttrs() throws Exception {
 +    executeQuery();
 +    checkIndexExist("l_orderkey_partkey_idx");
 +    executeString("drop index l_orderkey_partkey_idx");
 +    checkIndexNotExist("l_orderkey_partkey_idx");
 +  }
 +
 +  @Test
 +  public final void testCreateIndexWithCondition() throws Exception {
 +    executeQuery();
 +    checkIndexExist("l_orderkey_partkey_lt10_idx");
 +    executeString("drop index l_orderkey_partkey_lt10_idx");
 +    checkIndexNotExist("l_orderkey_partkey_lt10_idx");
 +  }
 +
 +  @Test
 +  public final void testCreateIndexOnExpression() throws Exception {
 +    executeQuery();
 +    checkIndexExist("l_orderkey_100_lt10_idx");
 +    executeString("drop index l_orderkey_100_lt10_idx");
 +    checkIndexNotExist("l_orderkey_100_lt10_idx");
 +  }
 +}