You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by mg...@apache.org on 2019/08/30 21:13:29 UTC

[hive] branch dsa_ex_func created (now 8d1ee07)

This is an automated email from the ASF dual-hosted git repository.

mgergely pushed a change to branch dsa_ex_func
in repository https://gitbox.apache.org/repos/asf/hive.git.


      at 8d1ee07  HIVE-XXXXX Break up DDLSemanticAnalyzer - extract Function related analyzers

This branch includes the following new commits:

     new 8d1ee07  HIVE-XXXXX Break up DDLSemanticAnalyzer - extract Function related analyzers

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[hive] 01/01: HIVE-XXXXX Break up DDLSemanticAnalyzer - extract Function related analyzers

Posted by mg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

mgergely pushed a commit to branch dsa_ex_func
in repository https://gitbox.apache.org/repos/asf/hive.git

commit 8d1ee073cf83866b01a6d982f6e4f10acff7ff90
Author: miklosgergely <mg...@cloudera.com>
AuthorDate: Thu Aug 29 14:11:20 2019 +0200

    HIVE-XXXXX Break up DDLSemanticAnalyzer - extract Function related analyzers
---
 .../ql/ddl/function/AbstractFunctionAnalyzer.java  |  81 ++++++++
 .../createfunction/CreateFunctionAnalyzer.java     | 108 +++++++++++
 .../{ => createfunction}/CreateFunctionDesc.java   |   2 +-
 .../CreateFunctionOperation.java                   |   2 +-
 .../ddl/function/createfunction/package-info.java} |  21 +--
 .../function/createmacro/CreateMacroAnalyzer.java  | 139 ++++++++++++++
 .../{ => createmacro}/CreateMacroDesc.java         |   2 +-
 .../{ => createmacro}/CreateMacroOperation.java    |   2 +-
 .../ql/ddl/function/createmacro/package-info.java} |  21 +--
 .../descfunction/DescFunctionAnalyzer.java         |  58 ++++++
 .../{ => descfunction}/DescFunctionDesc.java       |   8 +-
 .../{ => descfunction}/DescFunctionOperation.java  |   5 +-
 .../ddl/function/descfunction/package-info.java}   |  21 +--
 .../dropfunction/DropFunctionAnalyzer.java         |  67 +++++++
 .../{ => dropfunction}/DropFunctionDesc.java       |   2 +-
 .../{ => dropfunction}/DropFunctionOperation.java  |   2 +-
 .../ddl/function/dropfunction/package-info.java}   |  21 +--
 .../ddl/function/dropmacro/DropMacroAnalyzer.java  |  67 +++++++
 .../function/{ => dropmacro}/DropMacroDesc.java    |   2 +-
 .../{ => dropmacro}/DropMacroOperation.java        |   2 +-
 .../ql/ddl/function/dropmacro/package-info.java}   |  21 +--
 .../reloadfunctions/ReloadFunctionsAnalyzer.java   |  43 +++++
 .../{ => reloadfunctions}/ReloadFunctionsDesc.java |   2 +-
 .../ReloadFunctionsOperation.java                  |   2 +-
 .../function/reloadfunctions/package-info.java}    |  21 +--
 .../showfunctions/ShowFunctionsAnalyzer.java       |  59 ++++++
 .../{ => showfunctions}/ShowFunctionsDesc.java     |   2 +-
 .../ShowFunctionsOperation.java                    |   2 +-
 .../ddl/function/showfunctions/package-info.java}  |  21 +--
 .../hadoop/hive/ql/parse/DDLSemanticAnalyzer.java  |  62 -------
 .../hive/ql/parse/FunctionSemanticAnalyzer.java    | 204 ---------------------
 .../hive/ql/parse/MacroSemanticAnalyzer.java       | 175 ------------------
 .../hive/ql/parse/SemanticAnalyzerFactory.java     |  11 --
 .../repl/load/message/CreateFunctionHandler.java   |   2 +-
 .../repl/load/message/DropFunctionHandler.java     |   2 +-
 .../hive/ql/parse/TestMacroSemanticAnalyzer.java   |  21 ++-
 .../hive/ql/parse/TestSemanticAnalyzerFactory.java |  13 +-
 .../hadoop/hive/ql/plan/TestCreateMacroDesc.java   |   2 +-
 .../hadoop/hive/ql/plan/TestDropMacroDesc.java     |   2 +-
 39 files changed, 684 insertions(+), 616 deletions(-)

diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/AbstractFunctionAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/AbstractFunctionAnalyzer.java
new file mode 100644
index 0000000..997cb97
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/AbstractFunctionAnalyzer.java
@@ -0,0 +1,81 @@
+/*
+ * 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.hadoop.hive.ql.ddl.function;
+
+import java.util.List;
+
+import org.apache.hadoop.hive.metastore.api.Database;
+import org.apache.hadoop.hive.metastore.api.ResourceUri;
+import org.apache.hadoop.hive.ql.QueryState;
+import org.apache.hadoop.hive.ql.exec.FunctionUtils;
+import org.apache.hadoop.hive.ql.hooks.WriteEntity;
+import org.apache.hadoop.hive.ql.hooks.Entity.Type;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer;
+import org.apache.hadoop.hive.ql.parse.SemanticException;
+
+/**
+ * Abstract ancestor of function related ddl analyzer classes.
+ */
+public abstract class AbstractFunctionAnalyzer extends BaseSemanticAnalyzer {
+  public AbstractFunctionAnalyzer(QueryState queryState) throws SemanticException {
+    super(queryState);
+  }
+
+  /**
+   * Add write entities to the semantic analyzer to restrict function creation to privileged users.
+   */
+  protected void addEntities(String functionName, String className, boolean isTemporary,
+      List<ResourceUri> resources) throws SemanticException {
+    // If the function is being added under a database 'namespace', then add an entity representing
+    // the database (only applicable to permanent/metastore functions).
+    // We also add a second entity representing the function name.
+    // The authorization api implementation can decide which entities it wants to use to
+    // authorize the create/drop function call.
+
+    // Add the relevant database 'namespace' as a WriteEntity
+    Database database = null;
+
+    // temporary functions don't have any database 'namespace' associated with it
+    if (!isTemporary) {
+      try {
+        String[] qualifiedNameParts = FunctionUtils.getQualifiedFunctionNameParts(functionName);
+        String databaseName = qualifiedNameParts[0];
+        functionName = qualifiedNameParts[1];
+        database = getDatabase(databaseName);
+      } catch (HiveException e) {
+        LOG.error("Failed to get database ", e);
+        throw new SemanticException(e);
+      }
+    }
+    if (database != null) {
+      outputs.add(new WriteEntity(database, WriteEntity.WriteType.DDL_NO_LOCK));
+    }
+
+    // Add the function name as a WriteEntity
+    outputs.add(new WriteEntity(database, functionName, className, Type.FUNCTION, WriteEntity.WriteType.DDL_NO_LOCK));
+
+    if (resources != null) {
+      for (ResourceUri resource : resources) {
+        String uriPath = resource.getUri();
+        outputs.add(toWriteEntity(uriPath));
+      }
+    }
+  }
+}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createfunction/CreateFunctionAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createfunction/CreateFunctionAnalyzer.java
new file mode 100644
index 0000000..a7bb045
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createfunction/CreateFunctionAnalyzer.java
@@ -0,0 +1,108 @@
+/*
+ * 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.hadoop.hive.ql.ddl.function.createfunction;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.hadoop.hive.metastore.api.ResourceType;
+import org.apache.hadoop.hive.metastore.api.ResourceUri;
+import org.apache.hadoop.hive.ql.QueryState;
+import org.apache.hadoop.hive.ql.exec.FunctionUtils;
+import org.apache.hadoop.hive.ql.exec.TaskFactory;
+import org.apache.hadoop.hive.ql.ddl.DDLSemanticAnalyzerFactory.DDLType;
+import org.apache.hadoop.hive.ql.ddl.function.AbstractFunctionAnalyzer;
+import org.apache.hadoop.hive.ql.ddl.DDLWork;
+import org.apache.hadoop.hive.ql.parse.ASTNode;
+import org.apache.hadoop.hive.ql.parse.HiveParser;
+import org.apache.hadoop.hive.ql.parse.SemanticException;
+import org.apache.hadoop.hive.ql.plan.PlanUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Analyzer for function creation commands.
+ */
+@DDLType(type=HiveParser.TOK_CREATEFUNCTION)
+public class CreateFunctionAnalyzer extends AbstractFunctionAnalyzer {
+  private static final Logger SESISON_STATE_LOG = LoggerFactory.getLogger("SessionState");
+
+  public CreateFunctionAnalyzer(QueryState queryState) throws SemanticException {
+    super(queryState);
+  }
+
+  @Override
+  public void analyzeInternal(ASTNode root) throws SemanticException {
+    String functionName = root.getChild(0).getText().toLowerCase();
+    boolean isTemporary = (root.getFirstChildWithType(HiveParser.TOK_TEMPORARY) != null);
+    if (isTemporary && FunctionUtils.isQualifiedFunctionName(functionName)) {
+      throw new SemanticException("Temporary function cannot be created with a qualified name.");
+    }
+
+    String className = unescapeSQLString(root.getChild(1).getText());
+
+    List<ResourceUri> resources = getResourceList(root);
+    if (!isTemporary && resources == null) {
+      SESISON_STATE_LOG.warn("permanent functions created without USING  clause will not be replicated.");
+    }
+
+    CreateFunctionDesc desc = new CreateFunctionDesc(functionName, className, isTemporary, resources, null);
+    rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc)));
+
+    addEntities(functionName, className, isTemporary, resources);
+  }
+
+  private static final Map<Integer, ResourceType> TOKEN_TYPE_TO_RESOURCE_TYPE = ImmutableMap.of(
+      HiveParser.TOK_JAR, ResourceType.JAR,
+      HiveParser.TOK_FILE, ResourceType.FILE,
+      HiveParser.TOK_ARCHIVE, ResourceType.ARCHIVE);
+
+  private List<ResourceUri> getResourceList(ASTNode ast) throws SemanticException {
+    List<ResourceUri> resources = null;
+
+    ASTNode resourcesNode = (ASTNode) ast.getFirstChildWithType(HiveParser.TOK_RESOURCE_LIST);
+    if (resourcesNode != null) {
+      resources = new ArrayList<ResourceUri>();
+      for (int idx = 0; idx < resourcesNode.getChildCount(); ++idx) {
+        // ^(TOK_RESOURCE_URI $resType $resPath)
+        ASTNode node = (ASTNode) resourcesNode.getChild(idx);
+        if (node.getToken().getType() != HiveParser.TOK_RESOURCE_URI) {
+          throw new SemanticException("Expected token type TOK_RESOURCE_URI but found " + node.getToken().toString());
+        }
+        if (node.getChildCount() != 2) {
+          throw new SemanticException("Expected 2 child nodes of TOK_RESOURCE_URI but found " + node.getChildCount());
+        }
+
+        ASTNode resourceTypeNode = (ASTNode) node.getChild(0);
+        ASTNode resourceUriNode = (ASTNode) node.getChild(1);
+        ResourceType resourceType = TOKEN_TYPE_TO_RESOURCE_TYPE.get(resourceTypeNode.getType());
+        if (resourceType == null) {
+          throw new SemanticException("Unexpected token " + resourceTypeNode);
+        }
+
+        resources.add(new ResourceUri(resourceType, PlanUtils.stripQuotes(resourceUriNode.getText())));
+      }
+    }
+
+    return resources;
+  }
+}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/CreateFunctionDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createfunction/CreateFunctionDesc.java
similarity index 97%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/CreateFunctionDesc.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createfunction/CreateFunctionDesc.java
index 9e21aeb..f5f7b43 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/CreateFunctionDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createfunction/CreateFunctionDesc.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.createfunction;
 
 import java.io.Serializable;
 import java.util.List;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/CreateFunctionOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createfunction/CreateFunctionOperation.java
similarity index 99%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/CreateFunctionOperation.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createfunction/CreateFunctionOperation.java
index 995beed..830bbbc 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/CreateFunctionOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createfunction/CreateFunctionOperation.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.createfunction;
 
 import org.apache.hadoop.hive.ql.ddl.DDLOperationContext;
 import org.apache.hadoop.hive.ql.exec.FunctionInfo;
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createfunction/package-info.java
similarity index 62%
copy from ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
copy to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createfunction/package-info.java
index 5d553b4..e4f8424 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createfunction/package-info.java
@@ -15,23 +15,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.hadoop.hive.ql.plan;
 
-import org.apache.hadoop.hive.ql.ddl.function.DropMacroDesc;
-import org.junit.Assert;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class TestDropMacroDesc {
-  private String name;
-  @Before
-  public void setup() throws Exception {
-    name = "fixed_number";
-  }
-  @Test
-  public void testCreateMacroDesc() throws Exception {
-    DropMacroDesc desc = new DropMacroDesc(name);
-    Assert.assertEquals(name, desc.getName());
-  }
-}
+/** Function creation DDL operation. */
+package org.apache.hadoop.hive.ql.ddl.function.createfunction;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createmacro/CreateMacroAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createmacro/CreateMacroAnalyzer.java
new file mode 100644
index 0000000..f03e233
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createmacro/CreateMacroAnalyzer.java
@@ -0,0 +1,139 @@
+/*
+ * 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.hadoop.hive.ql.ddl.function.createmacro;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.Stack;
+
+import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.metastore.Warehouse;
+import org.apache.hadoop.hive.metastore.api.Database;
+import org.apache.hadoop.hive.metastore.api.FieldSchema;
+import org.apache.hadoop.hive.ql.QueryState;
+import org.apache.hadoop.hive.ql.exec.ColumnInfo;
+import org.apache.hadoop.hive.ql.exec.FunctionUtils;
+import org.apache.hadoop.hive.ql.exec.TaskFactory;
+import org.apache.hadoop.hive.ql.ddl.DDLSemanticAnalyzerFactory.DDLType;
+import org.apache.hadoop.hive.ql.ddl.DDLWork;
+import org.apache.hadoop.hive.ql.hooks.WriteEntity;
+import org.apache.hadoop.hive.ql.lib.Dispatcher;
+import org.apache.hadoop.hive.ql.lib.Node;
+import org.apache.hadoop.hive.ql.lib.PreOrderWalker;
+import org.apache.hadoop.hive.ql.parse.ASTNode;
+import org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer;
+import org.apache.hadoop.hive.ql.parse.CalcitePlanner;
+import org.apache.hadoop.hive.ql.parse.HiveParser;
+import org.apache.hadoop.hive.ql.parse.RowResolver;
+import org.apache.hadoop.hive.ql.parse.SemanticAnalyzer;
+import org.apache.hadoop.hive.ql.parse.SemanticException;
+import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
+
+/**
+ * Analyzer for macro creation commands.
+ */
+@DDLType(type=HiveParser.TOK_CREATEMACRO)
+public class CreateMacroAnalyzer extends BaseSemanticAnalyzer {
+  public CreateMacroAnalyzer(QueryState queryState) throws SemanticException {
+    super(queryState);
+  }
+
+  @Override
+  public void analyzeInternal(ASTNode root) throws SemanticException {
+    String macroName = root.getChild(0).getText();
+    if (FunctionUtils.isQualifiedFunctionName(macroName)) {
+      throw new SemanticException("Temporary macro cannot be created with a qualified name.");
+    }
+
+    List<FieldSchema> arguments = getColumns((ASTNode)root.getChild(1), true, conf);
+    Set<String> actualColumnNames = getActualColumnNames(root, arguments);
+
+    RowResolver rowResolver = new RowResolver();
+    ArrayList<String> macroColumnNames = new ArrayList<String>(arguments.size());
+    ArrayList<TypeInfo> macroColumnTypes = new ArrayList<TypeInfo>(arguments.size());
+
+    getMacroColumnData(arguments, actualColumnNames, rowResolver, macroColumnNames, macroColumnTypes);
+    ExprNodeDesc body = getBody(root, arguments, rowResolver);
+
+    CreateMacroDesc desc = new CreateMacroDesc(macroName, macroColumnNames, macroColumnTypes, body);
+    rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc)));
+
+    Database database = getDatabase(Warehouse.DEFAULT_DATABASE_NAME);
+    // This restricts macro creation to privileged users.
+    outputs.add(new WriteEntity(database, WriteEntity.WriteType.DDL_NO_LOCK));
+  }
+
+  private Set<String> getActualColumnNames(ASTNode root, List<FieldSchema> arguments) throws SemanticException {
+    final Set<String> actualColumnNames = new HashSet<String>();
+
+    if (!arguments.isEmpty()) {
+      // Walk down expression to see which arguments are actually used.
+      Node expression = (Node) root.getChild(2);
+      PreOrderWalker walker = new PreOrderWalker(new Dispatcher() {
+        @Override
+        public Object dispatch(Node nd, Stack<Node> stack, Object... nodeOutputs) throws SemanticException {
+          if (nd instanceof ASTNode) {
+            ASTNode node = (ASTNode)nd;
+            if (node.getType() == HiveParser.TOK_TABLE_OR_COL) {
+              actualColumnNames.add(node.getChild(0).getText());
+            }
+          }
+          return null;
+        }
+      });
+      walker.startWalking(Collections.singletonList(expression), null);
+    }
+
+    return actualColumnNames;
+  }
+
+  private void getMacroColumnData(List<FieldSchema> arguments, Set<String> actualColumnNames, RowResolver rowResolver,
+      ArrayList<String> macroColumnNames, ArrayList<TypeInfo> macroColumnTypes) throws SemanticException {
+    for (FieldSchema argument : arguments) {
+      TypeInfo columnType = TypeInfoUtils.getTypeInfoFromTypeString(argument.getType());
+      rowResolver.put("", argument.getName(), new ColumnInfo(argument.getName(), columnType, "", false));
+      macroColumnNames.add(argument.getName());
+      macroColumnTypes.add(columnType);
+    }
+    Set<String> expectedColumnNames = new LinkedHashSet<String>(macroColumnNames);
+    if (!expectedColumnNames.equals(actualColumnNames)) {
+      throw new SemanticException("Expected columns " + expectedColumnNames + " but found " + actualColumnNames);
+    }
+    if (expectedColumnNames.size() != macroColumnNames.size()) {
+      throw new SemanticException("At least one parameter name was used more than once " + macroColumnNames);
+    }
+  }
+
+  private ExprNodeDesc getBody(ASTNode root, List<FieldSchema> arguments, RowResolver rowResolver)
+      throws SemanticException {
+    SemanticAnalyzer sa = HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_CBO_ENABLED) ?
+        new CalcitePlanner(queryState) : new SemanticAnalyzer(queryState);
+
+    ExprNodeDesc body = arguments.isEmpty() ?
+        sa.genExprNodeDesc((ASTNode)root.getChild(1), rowResolver) :
+        sa.genExprNodeDesc((ASTNode)root.getChild(2), rowResolver);
+    return body;
+  }
+}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/CreateMacroDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createmacro/CreateMacroDesc.java
similarity index 97%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/CreateMacroDesc.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createmacro/CreateMacroDesc.java
index ba1b82e..589d737 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/CreateMacroDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createmacro/CreateMacroDesc.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.createmacro;
 
 import java.io.Serializable;
 import java.util.List;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/CreateMacroOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createmacro/CreateMacroOperation.java
similarity index 96%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/CreateMacroOperation.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createmacro/CreateMacroOperation.java
index c7787db..e25967c 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/CreateMacroOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createmacro/CreateMacroOperation.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.createmacro;
 
 import org.apache.hadoop.hive.ql.ddl.DDLOperation;
 import org.apache.hadoop.hive.ql.ddl.DDLOperationContext;
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createmacro/package-info.java
similarity index 62%
copy from ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
copy to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createmacro/package-info.java
index 5d553b4..a3a7706 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/createmacro/package-info.java
@@ -15,23 +15,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.hadoop.hive.ql.plan;
 
-import org.apache.hadoop.hive.ql.ddl.function.DropMacroDesc;
-import org.junit.Assert;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class TestDropMacroDesc {
-  private String name;
-  @Before
-  public void setup() throws Exception {
-    name = "fixed_number";
-  }
-  @Test
-  public void testCreateMacroDesc() throws Exception {
-    DropMacroDesc desc = new DropMacroDesc(name);
-    Assert.assertEquals(name, desc.getName());
-  }
-}
+/** Macro creation DDL operation. */
+package org.apache.hadoop.hive.ql.ddl.function.createmacro;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/descfunction/DescFunctionAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/descfunction/DescFunctionAnalyzer.java
new file mode 100644
index 0000000..8b97fd9
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/descfunction/DescFunctionAnalyzer.java
@@ -0,0 +1,58 @@
+/*
+ * 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.hadoop.hive.ql.ddl.function.descfunction;
+
+import org.apache.hadoop.hive.ql.QueryState;
+import org.apache.hadoop.hive.ql.exec.Task;
+import org.apache.hadoop.hive.ql.exec.TaskFactory;
+import org.apache.hadoop.hive.ql.ddl.DDLSemanticAnalyzerFactory.DDLType;
+import org.apache.hadoop.hive.ql.ddl.function.AbstractFunctionAnalyzer;
+import org.apache.hadoop.hive.ql.ddl.DDLWork;
+import org.apache.hadoop.hive.ql.parse.ASTNode;
+import org.apache.hadoop.hive.ql.parse.HiveParser;
+import org.apache.hadoop.hive.ql.parse.SemanticException;
+
+/**
+ * Analyzer for function describing commands.
+ */
+@DDLType(type=HiveParser.TOK_DESCFUNCTION)
+public class DescFunctionAnalyzer extends AbstractFunctionAnalyzer {
+  public DescFunctionAnalyzer(QueryState queryState) throws SemanticException {
+    super(queryState);
+  }
+
+  @Override
+  public void analyzeInternal(ASTNode root) throws SemanticException {
+    ctx.setResFile(ctx.getLocalTmpPath());
+
+    if (root.getChildCount() < 1 || root.getChildCount() > 2) {
+      throw new SemanticException("Unexpected Tokens at DESCRIBE FUNCTION");
+    }
+
+    String functionName = stripQuotes(root.getChild(0).getText());
+    boolean isExtended = root.getChildCount() == 2;
+
+    DescFunctionDesc desc = new DescFunctionDesc(ctx.getResFile(), functionName, isExtended);
+    Task<DDLWork> task = TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc));
+    rootTasks.add(task);
+
+    task.setFetchSource(true);
+    setFetchTask(createFetchTask(DescFunctionDesc.SCHEMA));
+  }
+}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DescFunctionDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/descfunction/DescFunctionDesc.java
similarity index 92%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DescFunctionDesc.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/descfunction/DescFunctionDesc.java
index 8adbc5b..7b6d0a6 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DescFunctionDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/descfunction/DescFunctionDesc.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.descfunction;
 
 import java.io.Serializable;
 
@@ -34,18 +34,18 @@ public class DescFunctionDesc implements DDLDesc, Serializable {
 
   public static final String SCHEMA = "tab_name#string";
 
-  private final String resFile;
+  private final Path resFile;
   private final String name;
   private final boolean isExtended;
 
   public DescFunctionDesc(Path resFile, String name, boolean isExtended) {
-    this.resFile = resFile.toString();
+    this.resFile = resFile;
     this.name = name;
     this.isExtended = isExtended;
   }
 
   @Explain(displayName = "result file", explainLevels = { Level.EXTENDED })
-  public String getResFile() {
+  public Path getResFile() {
     return resFile;
   }
 
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DescFunctionOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/descfunction/DescFunctionOperation.java
similarity index 95%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DescFunctionOperation.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/descfunction/DescFunctionOperation.java
index 5f0c977..1c3d7e1 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DescFunctionOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/descfunction/DescFunctionOperation.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.descfunction;
 
 import org.apache.hadoop.hive.ql.ddl.DDLOperationContext;
 import org.apache.hadoop.hive.ql.ddl.DDLUtils;
@@ -32,7 +32,6 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 import java.util.Set;
 
-import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hive.ql.ddl.DDLOperation;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.parse.SemanticException;
@@ -48,7 +47,7 @@ public class DescFunctionOperation extends DDLOperation<DescFunctionDesc> {
 
   @Override
   public int execute() throws HiveException {
-    try (DataOutputStream outStream = DDLUtils.getOutputStream(new Path(desc.getResFile()), context)) {
+    try (DataOutputStream outStream = DDLUtils.getOutputStream(desc.getResFile(), context)) {
       String funcName = desc.getName();
       FunctionInfo functionInfo = FunctionRegistry.getFunctionInfo(funcName);
       Class<?> funcClass = functionInfo == null ? null : functionInfo.getFunctionClass();
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/descfunction/package-info.java
similarity index 62%
copy from ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
copy to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/descfunction/package-info.java
index 5d553b4..8a678fb 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/descfunction/package-info.java
@@ -15,23 +15,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.hadoop.hive.ql.plan;
 
-import org.apache.hadoop.hive.ql.ddl.function.DropMacroDesc;
-import org.junit.Assert;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class TestDropMacroDesc {
-  private String name;
-  @Before
-  public void setup() throws Exception {
-    name = "fixed_number";
-  }
-  @Test
-  public void testCreateMacroDesc() throws Exception {
-    DropMacroDesc desc = new DropMacroDesc(name);
-    Assert.assertEquals(name, desc.getName());
-  }
-}
+/** Function describing DDL operation. */
+package org.apache.hadoop.hive.ql.ddl.function.descfunction;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropfunction/DropFunctionAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropfunction/DropFunctionAnalyzer.java
new file mode 100644
index 0000000..47059be
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropfunction/DropFunctionAnalyzer.java
@@ -0,0 +1,67 @@
+/*
+ * 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.hadoop.hive.ql.ddl.function.dropfunction;
+
+import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
+import org.apache.hadoop.hive.ql.ErrorMsg;
+import org.apache.hadoop.hive.ql.QueryState;
+import org.apache.hadoop.hive.ql.exec.FunctionInfo;
+import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
+import org.apache.hadoop.hive.ql.exec.TaskFactory;
+import org.apache.hadoop.hive.ql.ddl.DDLSemanticAnalyzerFactory.DDLType;
+import org.apache.hadoop.hive.ql.ddl.function.AbstractFunctionAnalyzer;
+import org.apache.hadoop.hive.ql.ddl.DDLWork;
+import org.apache.hadoop.hive.ql.parse.ASTNode;
+import org.apache.hadoop.hive.ql.parse.HiveParser;
+import org.apache.hadoop.hive.ql.parse.SemanticException;
+
+/**
+ * Analyzer for function dropping commands.
+ */
+@DDLType(type=HiveParser.TOK_DROPFUNCTION)
+public class DropFunctionAnalyzer extends AbstractFunctionAnalyzer {
+  public DropFunctionAnalyzer(QueryState queryState) throws SemanticException {
+    super(queryState);
+  }
+
+  @Override
+  public void analyzeInternal(ASTNode root) throws SemanticException {
+    String functionName = root.getChild(0).getText();
+    boolean ifExists = (root.getFirstChildWithType(HiveParser.TOK_IFEXISTS) != null);
+    boolean throwException = !ifExists && !HiveConf.getBoolVar(conf, ConfVars.DROP_IGNORES_NON_EXISTENT);
+    boolean isTemporary = (root.getFirstChildWithType(HiveParser.TOK_TEMPORARY) != null);
+
+    FunctionInfo info = FunctionRegistry.getFunctionInfo(functionName);
+    if (info == null) {
+      if (throwException) {
+        throw new SemanticException(ErrorMsg.INVALID_FUNCTION.getMsg(functionName));
+      } else {
+        return; // Fail silently
+      }
+    } else if (info.isBuiltIn()) {
+      throw new SemanticException(ErrorMsg.DROP_NATIVE_FUNCTION.getMsg(functionName));
+    }
+
+    DropFunctionDesc desc = new DropFunctionDesc(functionName, isTemporary, null);
+    rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc)));
+
+    addEntities(functionName, info.getClassName(), isTemporary, null);
+  }
+}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DropFunctionDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropfunction/DropFunctionDesc.java
similarity index 97%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DropFunctionDesc.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropfunction/DropFunctionDesc.java
index bc952e7..9768855 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DropFunctionDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropfunction/DropFunctionDesc.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.dropfunction;
 
 import java.io.Serializable;
 
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DropFunctionOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropfunction/DropFunctionOperation.java
similarity index 98%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DropFunctionOperation.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropfunction/DropFunctionOperation.java
index fae8583..8e1490c 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DropFunctionOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropfunction/DropFunctionOperation.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.dropfunction;
 
 import org.apache.hadoop.hive.ql.ddl.DDLOperationContext;
 import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropfunction/package-info.java
similarity index 62%
copy from ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
copy to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropfunction/package-info.java
index 5d553b4..4f0ffbc 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropfunction/package-info.java
@@ -15,23 +15,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.hadoop.hive.ql.plan;
 
-import org.apache.hadoop.hive.ql.ddl.function.DropMacroDesc;
-import org.junit.Assert;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class TestDropMacroDesc {
-  private String name;
-  @Before
-  public void setup() throws Exception {
-    name = "fixed_number";
-  }
-  @Test
-  public void testCreateMacroDesc() throws Exception {
-    DropMacroDesc desc = new DropMacroDesc(name);
-    Assert.assertEquals(name, desc.getName());
-  }
-}
+/** Function dropping DDL operation. */
+package org.apache.hadoop.hive.ql.ddl.function.dropfunction;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropmacro/DropMacroAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropmacro/DropMacroAnalyzer.java
new file mode 100644
index 0000000..9a6f343
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropmacro/DropMacroAnalyzer.java
@@ -0,0 +1,67 @@
+/*
+ * 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.hadoop.hive.ql.ddl.function.dropmacro;
+
+import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
+import org.apache.hadoop.hive.metastore.Warehouse;
+import org.apache.hadoop.hive.metastore.api.Database;
+import org.apache.hadoop.hive.ql.ErrorMsg;
+import org.apache.hadoop.hive.ql.QueryState;
+import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
+import org.apache.hadoop.hive.ql.exec.FunctionUtils;
+import org.apache.hadoop.hive.ql.exec.TaskFactory;
+import org.apache.hadoop.hive.ql.ddl.DDLSemanticAnalyzerFactory.DDLType;
+import org.apache.hadoop.hive.ql.ddl.DDLWork;
+import org.apache.hadoop.hive.ql.hooks.WriteEntity;
+import org.apache.hadoop.hive.ql.parse.ASTNode;
+import org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer;
+import org.apache.hadoop.hive.ql.parse.HiveParser;
+import org.apache.hadoop.hive.ql.parse.SemanticException;
+
+/**
+ * Analyzer for macro dropping commands.
+ */
+@DDLType(type=HiveParser.TOK_DROPMACRO)
+public class DropMacroAnalyzer extends BaseSemanticAnalyzer {
+  public DropMacroAnalyzer(QueryState queryState) throws SemanticException {
+    super(queryState);
+  }
+
+  @Override
+  public void analyzeInternal(ASTNode root) throws SemanticException {
+    String macroName = root.getChild(0).getText();
+    if (FunctionUtils.isQualifiedFunctionName(macroName)) {
+      throw new SemanticException("Temporary macro name cannot be a qualified name.");
+    }
+
+    boolean ifExists = (root.getFirstChildWithType(HiveParser.TOK_IFEXISTS) != null);
+    boolean throwException = !ifExists && !HiveConf.getBoolVar(conf, ConfVars.DROP_IGNORES_NON_EXISTENT);
+    if (throwException && FunctionRegistry.getFunctionInfo(macroName) == null) {
+      throw new SemanticException(ErrorMsg.INVALID_FUNCTION.getMsg(macroName));
+    }
+
+    DropMacroDesc desc = new DropMacroDesc(macroName);
+    rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc)));
+
+    Database database = getDatabase(Warehouse.DEFAULT_DATABASE_NAME);
+    // This restricts macro dropping to privileged users.
+    outputs.add(new WriteEntity(database, WriteEntity.WriteType.DDL_NO_LOCK));
+  }
+}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DropMacroDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropmacro/DropMacroDesc.java
similarity index 96%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DropMacroDesc.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropmacro/DropMacroDesc.java
index a09bfb4..b37a6dd 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DropMacroDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropmacro/DropMacroDesc.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.dropmacro;
 
 import java.io.Serializable;
 
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DropMacroOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropmacro/DropMacroOperation.java
similarity index 96%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DropMacroOperation.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropmacro/DropMacroOperation.java
index f7e5acb..8266505 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/DropMacroOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropmacro/DropMacroOperation.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.dropmacro;
 
 import org.apache.hadoop.hive.ql.ddl.DDLOperation;
 import org.apache.hadoop.hive.ql.ddl.DDLOperationContext;
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropmacro/package-info.java
similarity index 62%
copy from ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
copy to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropmacro/package-info.java
index 5d553b4..855113b 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/dropmacro/package-info.java
@@ -15,23 +15,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.hadoop.hive.ql.plan;
 
-import org.apache.hadoop.hive.ql.ddl.function.DropMacroDesc;
-import org.junit.Assert;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class TestDropMacroDesc {
-  private String name;
-  @Before
-  public void setup() throws Exception {
-    name = "fixed_number";
-  }
-  @Test
-  public void testCreateMacroDesc() throws Exception {
-    DropMacroDesc desc = new DropMacroDesc(name);
-    Assert.assertEquals(name, desc.getName());
-  }
-}
+/** Macro dropping DDL operation. */
+package org.apache.hadoop.hive.ql.ddl.function.dropmacro;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/reloadfunctions/ReloadFunctionsAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/reloadfunctions/ReloadFunctionsAnalyzer.java
new file mode 100644
index 0000000..9f2cf28
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/reloadfunctions/ReloadFunctionsAnalyzer.java
@@ -0,0 +1,43 @@
+/*
+ * 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.hadoop.hive.ql.ddl.function.reloadfunctions;
+
+import org.apache.hadoop.hive.ql.QueryState;
+import org.apache.hadoop.hive.ql.exec.TaskFactory;
+import org.apache.hadoop.hive.ql.ddl.DDLSemanticAnalyzerFactory.DDLType;
+import org.apache.hadoop.hive.ql.ddl.DDLWork;
+import org.apache.hadoop.hive.ql.parse.ASTNode;
+import org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer;
+import org.apache.hadoop.hive.ql.parse.HiveParser;
+import org.apache.hadoop.hive.ql.parse.SemanticException;
+
+/**
+ * Analyzer for reloading functions commands.
+ */
+@DDLType(type=HiveParser.TOK_RELOADFUNCTIONS)
+public class ReloadFunctionsAnalyzer extends BaseSemanticAnalyzer {
+  public ReloadFunctionsAnalyzer(QueryState queryState) throws SemanticException {
+    super(queryState);
+  }
+
+  @Override
+  public void analyzeInternal(ASTNode root) throws SemanticException {
+    rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), new ReloadFunctionsDesc())));
+  }
+}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/ReloadFunctionsDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/reloadfunctions/ReloadFunctionsDesc.java
similarity index 95%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/ReloadFunctionsDesc.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/reloadfunctions/ReloadFunctionsDesc.java
index f87ee55..67a090e 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/ReloadFunctionsDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/reloadfunctions/ReloadFunctionsDesc.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.reloadfunctions;
 
 import java.io.Serializable;
 
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/ReloadFunctionsOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/reloadfunctions/ReloadFunctionsOperation.java
similarity index 96%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/ReloadFunctionsOperation.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/reloadfunctions/ReloadFunctionsOperation.java
index 2ab119a..9ff2c19 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/ReloadFunctionsOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/reloadfunctions/ReloadFunctionsOperation.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.reloadfunctions;
 
 import org.apache.hadoop.hive.ql.ddl.DDLOperationContext;
 import org.apache.hadoop.hive.ql.ddl.DDLOperation;
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/reloadfunctions/package-info.java
similarity index 62%
copy from ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
copy to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/reloadfunctions/package-info.java
index 5d553b4..c5df3c0 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/reloadfunctions/package-info.java
@@ -15,23 +15,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.hadoop.hive.ql.plan;
 
-import org.apache.hadoop.hive.ql.ddl.function.DropMacroDesc;
-import org.junit.Assert;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class TestDropMacroDesc {
-  private String name;
-  @Before
-  public void setup() throws Exception {
-    name = "fixed_number";
-  }
-  @Test
-  public void testCreateMacroDesc() throws Exception {
-    DropMacroDesc desc = new DropMacroDesc(name);
-    Assert.assertEquals(name, desc.getName());
-  }
-}
+/** Function reloading DDL operation. */
+package org.apache.hadoop.hive.ql.ddl.function.reloadfunctions;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/showfunctions/ShowFunctionsAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/showfunctions/ShowFunctionsAnalyzer.java
new file mode 100644
index 0000000..49c977b
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/showfunctions/ShowFunctionsAnalyzer.java
@@ -0,0 +1,59 @@
+/*
+ * 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.hadoop.hive.ql.ddl.function.showfunctions;
+
+import org.apache.hadoop.hive.ql.QueryState;
+import org.apache.hadoop.hive.ql.exec.Task;
+import org.apache.hadoop.hive.ql.exec.TaskFactory;
+import org.apache.hadoop.hive.ql.ddl.DDLSemanticAnalyzerFactory.DDLType;
+import org.apache.hadoop.hive.ql.ddl.DDLWork;
+import org.apache.hadoop.hive.ql.parse.ASTNode;
+import org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer;
+import org.apache.hadoop.hive.ql.parse.HiveParser;
+import org.apache.hadoop.hive.ql.parse.SemanticException;
+
+/**
+ * Analyzer for showing functions commands.
+ */
+@DDLType(type=HiveParser.TOK_SHOWFUNCTIONS)
+public class ShowFunctionsAnalyzer extends BaseSemanticAnalyzer {
+  public ShowFunctionsAnalyzer(QueryState queryState) throws SemanticException {
+    super(queryState);
+  }
+
+  @Override
+  public void analyzeInternal(ASTNode root) throws SemanticException {
+    ctx.setResFile(ctx.getLocalTmpPath());
+
+    ShowFunctionsDesc desc;
+    if (root.getChildCount() > 0) {
+      assert (root.getChildCount() == 2);
+      assert (root.getChild(0).getType() == HiveParser.KW_LIKE);
+      String functionNames = stripQuotes(root.getChild(1).getText());
+      desc = new ShowFunctionsDesc(ctx.getResFile(), functionNames);
+    } else {
+      desc = new ShowFunctionsDesc(ctx.getResFile());
+    }
+    Task<DDLWork> task = TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc));
+    rootTasks.add(task);
+
+    task.setFetchSource(true);
+    setFetchTask(createFetchTask(ShowFunctionsDesc.SCHEMA));
+  }
+}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/ShowFunctionsDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/showfunctions/ShowFunctionsDesc.java
similarity index 96%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/ShowFunctionsDesc.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/showfunctions/ShowFunctionsDesc.java
index 9784b1a..90eab01 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/ShowFunctionsDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/showfunctions/ShowFunctionsDesc.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.showfunctions;
 
 import java.io.Serializable;
 
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/ShowFunctionsOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/showfunctions/ShowFunctionsOperation.java
similarity index 97%
rename from ql/src/java/org/apache/hadoop/hive/ql/ddl/function/ShowFunctionsOperation.java
rename to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/showfunctions/ShowFunctionsOperation.java
index 14a8f92..8b05061 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/ShowFunctionsOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/showfunctions/ShowFunctionsOperation.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hive.ql.ddl.function;
+package org.apache.hadoop.hive.ql.ddl.function.showfunctions;
 
 import org.apache.hadoop.hive.ql.ddl.DDLOperationContext;
 import org.apache.hadoop.hive.ql.ddl.DDLUtils;
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/showfunctions/package-info.java
similarity index 62%
copy from ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
copy to ql/src/java/org/apache/hadoop/hive/ql/ddl/function/showfunctions/package-info.java
index 5d553b4..bbc1853 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/function/showfunctions/package-info.java
@@ -15,23 +15,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.hadoop.hive.ql.plan;
 
-import org.apache.hadoop.hive.ql.ddl.function.DropMacroDesc;
-import org.junit.Assert;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class TestDropMacroDesc {
-  private String name;
-  @Before
-  public void setup() throws Exception {
-    name = "fixed_number";
-  }
-  @Test
-  public void testCreateMacroDesc() throws Exception {
-    DropMacroDesc desc = new DropMacroDesc(name);
-    Assert.assertEquals(name, desc.getName());
-  }
-}
+/** Showing functions DDL operation. */
+package org.apache.hadoop.hive.ql.ddl.function.showfunctions;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
index 5f19ca8..eb241cf 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
@@ -70,8 +70,6 @@ import org.apache.hadoop.hive.ql.QueryState;
 import org.apache.hadoop.hive.ql.ddl.DDLDesc;
 import org.apache.hadoop.hive.ql.ddl.DDLDesc.DDLDescWithWriteId;
 import org.apache.hadoop.hive.ql.ddl.DDLWork;
-import org.apache.hadoop.hive.ql.ddl.function.DescFunctionDesc;
-import org.apache.hadoop.hive.ql.ddl.function.ShowFunctionsDesc;
 import org.apache.hadoop.hive.ql.ddl.misc.CacheMetadataDesc;
 import org.apache.hadoop.hive.ql.ddl.misc.MsckDesc;
 import org.apache.hadoop.hive.ql.ddl.misc.ShowConfDesc;
@@ -410,10 +408,6 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
       ctx.setResFile(ctx.getLocalTmpPath());
       analyzeShowTableProperties(ast);
       break;
-    case HiveParser.TOK_SHOWFUNCTIONS:
-      ctx.setResFile(ctx.getLocalTmpPath());
-      analyzeShowFunctions(ast);
-      break;
     case HiveParser.TOK_SHOWLOCKS:
       ctx.setResFile(ctx.getLocalTmpPath());
       analyzeShowLocks(ast);
@@ -448,10 +442,6 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
       ctx.setResFile(ctx.getLocalTmpPath());
       analyzeShowMaterializedViews(ast);
       break;
-    case HiveParser.TOK_DESCFUNCTION:
-      ctx.setResFile(ctx.getLocalTmpPath());
-      analyzeDescFunction(ast);
-      break;
     case HiveParser.TOK_MSCK:
       ctx.setResFile(ctx.getLocalTmpPath());
       analyzeMetastoreCheck(ast);
@@ -2547,29 +2537,6 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
 
   /**
    * Add the task according to the parsed command tree. This is used for the CLI
-   * command "SHOW FUNCTIONS;".
-   *
-   * @param ast
-   *          The parsed command tree.
-   * @throws SemanticException
-   *           Parsin failed
-   */
-  private void analyzeShowFunctions(ASTNode ast) throws SemanticException {
-    ShowFunctionsDesc showFuncsDesc;
-    if (ast.getChildCount() > 0) {
-      assert (ast.getChildCount() == 2);
-      assert (ast.getChild(0).getType() == HiveParser.KW_LIKE);
-      String funcNames = stripQuotes(ast.getChild(1).getText());
-      showFuncsDesc = new ShowFunctionsDesc(ctx.getResFile(), funcNames);
-    } else {
-      showFuncsDesc = new ShowFunctionsDesc(ctx.getResFile());
-    }
-    rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), showFuncsDesc)));
-    setFetchTask(createFetchTask(ShowFunctionsDesc.SCHEMA));
-  }
-
-  /**
-   * Add the task according to the parsed command tree. This is used for the CLI
    * command "SHOW LOCKS;".
    *
    * @param ast
@@ -2856,35 +2823,6 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
     ctx.setNeedLockMgr(true);
   }
 
-  /**
-   * Add the task according to the parsed command tree. This is used for the CLI
-   * command "DESCRIBE FUNCTION;".
-   *
-   * @param ast
-   *          The parsed command tree.
-   * @throws SemanticException
-   *           Parsing failed
-   */
-  private void analyzeDescFunction(ASTNode ast) throws SemanticException {
-    String funcName;
-    boolean isExtended;
-
-    if (ast.getChildCount() == 1) {
-      funcName = stripQuotes(ast.getChild(0).getText());
-      isExtended = false;
-    } else if (ast.getChildCount() == 2) {
-      funcName = stripQuotes(ast.getChild(0).getText());
-      isExtended = true;
-    } else {
-      throw new SemanticException("Unexpected Tokens at DESCRIBE FUNCTION");
-    }
-
-    DescFunctionDesc descFuncDesc = new DescFunctionDesc(ctx.getResFile(), funcName, isExtended);
-    rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), descFuncDesc)));
-    setFetchTask(createFetchTask(DescFunctionDesc.SCHEMA));
-  }
-
-
   private void analyzeAlterTableRename(String[] source, ASTNode ast, boolean expectView)
       throws SemanticException {
     String[] target = getQualifiedTableName((ASTNode) ast.getChild(0));
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/FunctionSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/FunctionSemanticAnalyzer.java
deleted file mode 100644
index 8dd5674..0000000
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/FunctionSemanticAnalyzer.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.hadoop.hive.ql.parse;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.hadoop.hive.conf.HiveConf;
-import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
-import org.apache.hadoop.hive.metastore.api.Database;
-import org.apache.hadoop.hive.metastore.api.ResourceType;
-import org.apache.hadoop.hive.metastore.api.ResourceUri;
-import org.apache.hadoop.hive.ql.ErrorMsg;
-import org.apache.hadoop.hive.ql.QueryState;
-import org.apache.hadoop.hive.ql.ddl.DDLWork;
-import org.apache.hadoop.hive.ql.ddl.function.CreateFunctionDesc;
-import org.apache.hadoop.hive.ql.ddl.function.DropFunctionDesc;
-import org.apache.hadoop.hive.ql.ddl.function.ReloadFunctionsDesc;
-import org.apache.hadoop.hive.ql.exec.FunctionInfo;
-import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
-import org.apache.hadoop.hive.ql.exec.FunctionUtils;
-import org.apache.hadoop.hive.ql.exec.TaskFactory;
-import org.apache.hadoop.hive.ql.hooks.Entity.Type;
-import org.apache.hadoop.hive.ql.hooks.WriteEntity;
-import org.apache.hadoop.hive.ql.metadata.HiveException;
-import org.apache.hadoop.hive.ql.plan.PlanUtils;
-
-/**
- * FunctionSemanticAnalyzer.
- *
- */
-public class FunctionSemanticAnalyzer extends BaseSemanticAnalyzer {
-  private static final Logger LOG = LoggerFactory.getLogger(FunctionSemanticAnalyzer.class);
-  private static final Logger SESISON_STATE_LOG= LoggerFactory.getLogger("SessionState");
-
-  public FunctionSemanticAnalyzer(QueryState queryState) throws SemanticException {
-    super(queryState);
-  }
-
-  @Override
-  public void analyzeInternal(ASTNode ast) throws SemanticException {
-    if (ast.getType() == HiveParser.TOK_CREATEFUNCTION) {
-      analyzeCreateFunction(ast);
-    } else if (ast.getType() == HiveParser.TOK_DROPFUNCTION) {
-      analyzeDropFunction(ast);
-    } else if (ast.getType() == HiveParser.TOK_RELOADFUNCTIONS) {
-      rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), new ReloadFunctionsDesc())));
-    }
-
-    LOG.info("analyze done");
-  }
-
-  private void analyzeCreateFunction(ASTNode ast) throws SemanticException {
-    // ^(TOK_CREATEFUNCTION identifier StringLiteral ({isTempFunction}? => TOK_TEMPORARY))
-    String functionName = ast.getChild(0).getText().toLowerCase();
-    boolean isTemporaryFunction = (ast.getFirstChildWithType(HiveParser.TOK_TEMPORARY) != null);
-    String className = unescapeSQLString(ast.getChild(1).getText());
-
-    // Temp functions are not allowed to have qualified names.
-    if (isTemporaryFunction && FunctionUtils.isQualifiedFunctionName(functionName)) {
-      throw new SemanticException("Temporary function cannot be created with a qualified name.");
-    }
-
-    // find any referenced resources
-    List<ResourceUri> resources = getResourceList(ast);
-    if (!isTemporaryFunction && resources == null) {
-      SESISON_STATE_LOG.warn("permanent functions created without USING  clause will not be replicated.");
-    }
-
-    CreateFunctionDesc desc =
-        new CreateFunctionDesc(functionName, className, isTemporaryFunction, resources, null);
-    rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc)));
-
-    addEntities(functionName, className, isTemporaryFunction, resources);
-  }
-
-  private void analyzeDropFunction(ASTNode ast) throws SemanticException {
-    // ^(TOK_DROPFUNCTION identifier ifExists? $temp?)
-    String functionName = ast.getChild(0).getText();
-    boolean ifExists = (ast.getFirstChildWithType(HiveParser.TOK_IFEXISTS) != null);
-    // we want to signal an error if the function doesn't exist and we're
-    // configured not to ignore this
-    boolean throwException =
-        !ifExists && !HiveConf.getBoolVar(conf, ConfVars.DROP_IGNORES_NON_EXISTENT);
-
-    FunctionInfo info = FunctionRegistry.getFunctionInfo(functionName);
-    if (info == null) {
-      if (throwException) {
-        throw new SemanticException(ErrorMsg.INVALID_FUNCTION.getMsg(functionName));
-      } else {
-        // Fail silently
-        return;
-      }
-    } else if (info.isBuiltIn()) {
-      throw new SemanticException(ErrorMsg.DROP_NATIVE_FUNCTION.getMsg(functionName));
-    }
-
-    boolean isTemporaryFunction = (ast.getFirstChildWithType(HiveParser.TOK_TEMPORARY) != null);
-    DropFunctionDesc desc = new DropFunctionDesc(functionName, isTemporaryFunction, null);
-    rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc)));
-
-    addEntities(functionName, info.getClassName(), isTemporaryFunction, null);
-  }
-
-  private ResourceType getResourceType(ASTNode token) throws SemanticException {
-    switch (token.getType()) {
-      case HiveParser.TOK_JAR:
-        return ResourceType.JAR;
-      case HiveParser.TOK_FILE:
-        return ResourceType.FILE;
-      case HiveParser.TOK_ARCHIVE:
-        return ResourceType.ARCHIVE;
-      default:
-        throw new SemanticException("Unexpected token " + token.toString());
-    }
-  }
-
-  private List<ResourceUri> getResourceList(ASTNode ast) throws SemanticException {
-    List<ResourceUri> resources = null;
-    ASTNode resourcesNode = (ASTNode) ast.getFirstChildWithType(HiveParser.TOK_RESOURCE_LIST);
-
-    if (resourcesNode != null) {
-      resources = new ArrayList<ResourceUri>();
-      for (int idx = 0; idx < resourcesNode.getChildCount(); ++idx) {
-        // ^(TOK_RESOURCE_URI $resType $resPath)
-        ASTNode resNode = (ASTNode) resourcesNode.getChild(idx);
-        if (resNode.getToken().getType() != HiveParser.TOK_RESOURCE_URI) {
-          throw new SemanticException("Expected token type TOK_RESOURCE_URI but found "
-              + resNode.getToken().toString());
-        }
-        if (resNode.getChildCount() != 2) {
-          throw new SemanticException("Expected 2 child nodes of TOK_RESOURCE_URI but found "
-              + resNode.getChildCount());
-        }
-        ASTNode resTypeNode = (ASTNode) resNode.getChild(0);
-        ASTNode resUriNode = (ASTNode) resNode.getChild(1);
-        ResourceType resourceType = getResourceType(resTypeNode);
-        resources.add(new ResourceUri(resourceType, PlanUtils.stripQuotes(resUriNode.getText())));
-      }
-    }
-
-    return resources;
-  }
-
-  /**
-   * Add write entities to the semantic analyzer to restrict function creation to privileged users.
-   */
-  private void addEntities(String functionName, String className, boolean isTemporaryFunction,
-      List<ResourceUri> resources) throws SemanticException {
-    // If the function is being added under a database 'namespace', then add an entity representing
-    // the database (only applicable to permanent/metastore functions).
-    // We also add a second entity representing the function name.
-    // The authorization api implementation can decide which entities it wants to use to
-    // authorize the create/drop function call.
-
-    // Add the relevant database 'namespace' as a WriteEntity
-    Database database = null;
-
-    // temporary functions don't have any database 'namespace' associated with it,
-    // it matters only for permanent functions
-    if (!isTemporaryFunction) {
-      try {
-        String[] qualifiedNameParts = FunctionUtils.getQualifiedFunctionNameParts(functionName);
-        String dbName = qualifiedNameParts[0];
-        functionName = qualifiedNameParts[1];
-        database = getDatabase(dbName);
-      } catch (HiveException e) {
-        LOG.error("Failed to get database ", e);
-        throw new SemanticException(e);
-      }
-    }
-    if (database != null) {
-      outputs.add(new WriteEntity(database, WriteEntity.WriteType.DDL_NO_LOCK));
-    }
-
-    // Add the function name as a WriteEntity
-    outputs.add(new WriteEntity(database, functionName, className, Type.FUNCTION,
-        WriteEntity.WriteType.DDL_NO_LOCK));
-
-    if (resources != null) {
-      for (ResourceUri resource : resources) {
-        String uriPath = resource.getUri();
-        outputs.add(toWriteEntity(uriPath));
-      }
-    }
-  }
-}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/MacroSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/MacroSemanticAnalyzer.java
deleted file mode 100644
index e79512e..0000000
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/MacroSemanticAnalyzer.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.hadoop.hive.ql.parse;
-
-import static org.apache.hadoop.hive.ql.parse.HiveParser.TOK_IFEXISTS;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.Stack;
-import java.util.LinkedHashSet;
-
-import org.apache.hadoop.hive.metastore.Warehouse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.hadoop.hive.conf.HiveConf;
-import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
-import org.apache.hadoop.hive.metastore.api.Database;
-import org.apache.hadoop.hive.metastore.api.FieldSchema;
-import org.apache.hadoop.hive.ql.ErrorMsg;
-import org.apache.hadoop.hive.ql.QueryState;
-import org.apache.hadoop.hive.ql.ddl.DDLWork;
-import org.apache.hadoop.hive.ql.ddl.function.CreateMacroDesc;
-import org.apache.hadoop.hive.ql.ddl.function.DropMacroDesc;
-import org.apache.hadoop.hive.ql.exec.ColumnInfo;
-import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
-import org.apache.hadoop.hive.ql.exec.FunctionUtils;
-import org.apache.hadoop.hive.ql.exec.TaskFactory;
-import org.apache.hadoop.hive.ql.hooks.WriteEntity;
-import org.apache.hadoop.hive.ql.lib.Dispatcher;
-import org.apache.hadoop.hive.ql.lib.Node;
-import org.apache.hadoop.hive.ql.lib.PreOrderWalker;
-import org.apache.hadoop.hive.ql.plan.ExprNodeDesc;
-import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
-import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
-
-/**
- * MacroSemanticAnalyzer.
- *
- */
-public class MacroSemanticAnalyzer extends BaseSemanticAnalyzer {
-  private static final Logger LOG = LoggerFactory
-      .getLogger(MacroSemanticAnalyzer.class);
-
-  public MacroSemanticAnalyzer(QueryState queryState) throws SemanticException {
-    super(queryState);
-  }
-
-  @Override
-  public void analyzeInternal(ASTNode ast) throws SemanticException {
-    if (ast.getToken().getType() == HiveParser.TOK_CREATEMACRO) {
-      LOG.debug("Analyzing create macro " + ast.dump());
-      analyzeCreateMacro(ast);
-    }
-    if (ast.getToken().getType() == HiveParser.TOK_DROPMACRO) {
-      LOG.debug("Analyzing drop macro " + ast.dump());
-      analyzeDropMacro(ast);
-    }
-  }
-
-  private void analyzeCreateMacro(ASTNode ast) throws SemanticException {
-    String functionName = ast.getChild(0).getText();
-
-    // Temp macros are not allowed to have qualified names.
-    if (FunctionUtils.isQualifiedFunctionName(functionName)) {
-      throw new SemanticException("Temporary macro cannot be created with a qualified name.");
-    }
-
-    List<FieldSchema> arguments =
-      BaseSemanticAnalyzer.getColumns((ASTNode)ast.getChild(1), true, conf);
-    boolean isNoArgumentMacro = arguments.size() == 0;
-    RowResolver rowResolver = new RowResolver();
-    ArrayList<String> macroColNames = new ArrayList<String>(arguments.size());
-    ArrayList<TypeInfo> macroColTypes = new ArrayList<TypeInfo>(arguments.size());
-    final Set<String> actualColumnNames = new HashSet<String>();
-
-    if(!isNoArgumentMacro) {
-      /*
-       * Walk down expression to see which arguments are actually used.
-       */
-      Node expression = (Node) ast.getChild(2);
-      PreOrderWalker walker = new PreOrderWalker(new Dispatcher() {
-        @Override
-        public Object dispatch(Node nd, Stack<Node> stack, Object... nodeOutputs)
-            throws SemanticException {
-          if(nd instanceof ASTNode) {
-            ASTNode node = (ASTNode)nd;
-            if(node.getType() == HiveParser.TOK_TABLE_OR_COL) {
-              actualColumnNames.add(node.getChild(0).getText());
-            }
-          }
-          return null;
-        }
-      });
-      walker.startWalking(Collections.singletonList(expression), null);
-    }
-    for (FieldSchema argument : arguments) {
-      TypeInfo colType =
-          TypeInfoUtils.getTypeInfoFromTypeString(argument.getType());
-      rowResolver.put("", argument.getName(),
-          new ColumnInfo(argument.getName(), colType, "", false));
-      macroColNames.add(argument.getName());
-      macroColTypes.add(colType);
-    }
-    Set<String> expectedColumnNames = new LinkedHashSet<String>(macroColNames);
-    if(!expectedColumnNames.equals(actualColumnNames)) {
-      throw new SemanticException("Expected columns " + expectedColumnNames + " but found "
-          + actualColumnNames);
-    }
-    if(expectedColumnNames.size() != macroColNames.size()) {
-      throw new SemanticException("At least one parameter name was used more than once "
-          + macroColNames);
-    }
-    SemanticAnalyzer sa = HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_CBO_ENABLED) ?
-        new CalcitePlanner(queryState) : new SemanticAnalyzer(queryState);
-    ;
-    ExprNodeDesc body;
-    if(isNoArgumentMacro) {
-      body = sa.genExprNodeDesc((ASTNode)ast.getChild(1), rowResolver);
-    } else {
-        body = sa.genExprNodeDesc((ASTNode)ast.getChild(2), rowResolver);
-    }
-    CreateMacroDesc desc = new CreateMacroDesc(functionName, macroColNames, macroColTypes, body);
-    rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc)));
-
-    addEntities();
-  }
-
-  private void analyzeDropMacro(ASTNode ast) throws SemanticException {
-    String functionName = ast.getChild(0).getText();
-    boolean ifExists = (ast.getFirstChildWithType(TOK_IFEXISTS) != null);
-    // we want to signal an error if the function doesn't exist and we're
-    // configured not to ignore this
-    boolean throwException =
-        !ifExists && !HiveConf.getBoolVar(conf, ConfVars.DROP_IGNORES_NON_EXISTENT);
-
-    // Temp macros are not allowed to have qualified names.
-    if (FunctionUtils.isQualifiedFunctionName(functionName)) {
-      throw new SemanticException("Temporary macro name cannot be a qualified name.");
-    }
-
-    if (throwException && FunctionRegistry.getFunctionInfo(functionName) == null) {
-      throw new SemanticException(ErrorMsg.INVALID_FUNCTION.getMsg(functionName));
-    }
-
-    DropMacroDesc desc = new DropMacroDesc(functionName);
-    rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc)));
-
-    addEntities();
-  }
-
-  private void addEntities() throws SemanticException {
-    Database database = getDatabase(Warehouse.DEFAULT_DATABASE_NAME);
-    // This restricts macro creation to privileged users.
-    outputs.add(new WriteEntity(database, WriteEntity.WriteType.DDL_NO_LOCK));
-  }
-}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java
index 763e996..3afead0 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java
@@ -300,14 +300,12 @@ public final class SemanticAnalyzerFactory {
       case HiveParser.TOK_DROPVIEW:
       case HiveParser.TOK_DROP_MATERIALIZED_VIEW:
       case HiveParser.TOK_DESCTABLE:
-      case HiveParser.TOK_DESCFUNCTION:
       case HiveParser.TOK_MSCK:
       case HiveParser.TOK_SHOWTABLES:
       case HiveParser.TOK_SHOWCOLUMNS:
       case HiveParser.TOK_SHOW_TABLESTATUS:
       case HiveParser.TOK_SHOW_TBLPROPERTIES:
       case HiveParser.TOK_SHOW_CREATETABLE:
-      case HiveParser.TOK_SHOWFUNCTIONS:
       case HiveParser.TOK_SHOWPARTITIONS:
       case HiveParser.TOK_SHOWLOCKS:
       case HiveParser.TOK_SHOWDBLOCKS:
@@ -349,18 +347,9 @@ public final class SemanticAnalyzerFactory {
       case HiveParser.TOK_DROP_MAPPING:
         return new DDLSemanticAnalyzer(queryState);
 
-      case HiveParser.TOK_CREATEFUNCTION:
-      case HiveParser.TOK_DROPFUNCTION:
-      case HiveParser.TOK_RELOADFUNCTIONS:
-        return new FunctionSemanticAnalyzer(queryState);
-
       case HiveParser.TOK_ANALYZE:
         return new ColumnStatsSemanticAnalyzer(queryState);
 
-      case HiveParser.TOK_CREATEMACRO:
-      case HiveParser.TOK_DROPMACRO:
-        return new MacroSemanticAnalyzer(queryState);
-
       case HiveParser.TOK_UPDATE_TABLE:
       case HiveParser.TOK_DELETE_FROM:
         return new UpdateDeleteSemanticAnalyzer(queryState);
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/CreateFunctionHandler.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/CreateFunctionHandler.java
index bc891f7..7d0ccc5 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/CreateFunctionHandler.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/CreateFunctionHandler.java
@@ -28,7 +28,7 @@ import org.apache.hadoop.hive.metastore.ReplChangeManager;
 import org.apache.hadoop.hive.metastore.api.ResourceUri;
 import org.apache.hadoop.hive.ql.ErrorMsg;
 import org.apache.hadoop.hive.ql.ddl.DDLWork;
-import org.apache.hadoop.hive.ql.ddl.function.CreateFunctionDesc;
+import org.apache.hadoop.hive.ql.ddl.function.createfunction.CreateFunctionDesc;
 import org.apache.hadoop.hive.ql.exec.FunctionUtils;
 import org.apache.hadoop.hive.ql.exec.ReplCopyTask;
 import org.apache.hadoop.hive.ql.exec.Task;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/DropFunctionHandler.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/DropFunctionHandler.java
index 11203f1..bbd1d6c 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/DropFunctionHandler.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/DropFunctionHandler.java
@@ -19,7 +19,7 @@ package org.apache.hadoop.hive.ql.parse.repl.load.message;
 
 import org.apache.hadoop.hive.metastore.messaging.DropFunctionMessage;
 import org.apache.hadoop.hive.ql.ddl.DDLWork;
-import org.apache.hadoop.hive.ql.ddl.function.DropFunctionDesc;
+import org.apache.hadoop.hive.ql.ddl.function.dropfunction.DropFunctionDesc;
 import org.apache.hadoop.hive.ql.exec.FunctionUtils;
 import org.apache.hadoop.hive.ql.exec.Task;
 import org.apache.hadoop.hive.ql.exec.TaskFactory;
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/parse/TestMacroSemanticAnalyzer.java b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestMacroSemanticAnalyzer.java
index fff0a3d..0030649 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/parse/TestMacroSemanticAnalyzer.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestMacroSemanticAnalyzer.java
@@ -24,6 +24,7 @@ import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
 import org.apache.hadoop.hive.ql.Context;
 import org.apache.hadoop.hive.ql.DriverContext;
 import org.apache.hadoop.hive.ql.QueryState;
+import org.apache.hadoop.hive.ql.ddl.DDLSemanticAnalyzerFactory;
 import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
 import org.apache.hadoop.hive.ql.exec.Task;
 import org.apache.hadoop.hive.ql.session.SessionState;
@@ -35,7 +36,6 @@ import org.junit.Assert;
 
 public class TestMacroSemanticAnalyzer {
 
-  private MacroSemanticAnalyzer analyzer;
   private QueryState queryState;
   private HiveConf conf;
   private Context context;
@@ -46,13 +46,14 @@ public class TestMacroSemanticAnalyzer {
     conf = queryState.getConf();
     SessionState.start(conf);
     context = new Context(conf);
-    analyzer = new MacroSemanticAnalyzer(queryState);
   }
 
   private ASTNode parse(String command) throws Exception {
     return ParseUtils.parse(command);
   }
+
   private void analyze(ASTNode ast) throws Exception {
+    BaseSemanticAnalyzer analyzer = DDLSemanticAnalyzerFactory.getAnalyzer(ast, queryState);
     analyzer.analyze(ast, context);
     List<Task<?>> rootTasks = analyzer.getRootTasks();
     Assert.assertEquals(1, rootTasks.size());
@@ -66,71 +67,87 @@ public class TestMacroSemanticAnalyzer {
   public void testDropMacroDoesNotExist() throws Exception {
     analyze(parse("DROP TEMPORARY MACRO SOME_MACRO"));
   }
+
   @Test
   public void testDropMacroExistsDoNotIgnoreErrors() throws Exception {
     conf.setBoolVar(ConfVars.DROP_IGNORES_NON_EXISTENT, false);
     FunctionRegistry.registerTemporaryUDF("SOME_MACRO", GenericUDFMacro.class);
     analyze(parse("DROP TEMPORARY MACRO SOME_MACRO"));
   }
+
   @Test
   public void testDropMacro() throws Exception {
     FunctionRegistry.registerTemporaryUDF("SOME_MACRO", GenericUDFMacro.class);
     analyze(parse("DROP TEMPORARY MACRO SOME_MACRO"));
   }
+
   @Test(expected = SemanticException.class)
   public void testDropMacroNonExistent() throws Exception {
     conf.setBoolVar(ConfVars.DROP_IGNORES_NON_EXISTENT, false);
     analyze(parse("DROP TEMPORARY MACRO SOME_MACRO"));
   }
+
   @Test
   public void testDropMacroNonExistentWithIfExists() throws Exception {
     analyze(parse("DROP TEMPORARY MACRO IF EXISTS SOME_MACRO"));
   }
+
   @Test
   public void testDropMacroNonExistentWithIfExistsDoNotIgnoreNonExistent() throws Exception {
     conf.setBoolVar(ConfVars.DROP_IGNORES_NON_EXISTENT, false);
     analyze(parse("DROP TEMPORARY MACRO IF EXISTS SOME_MACRO"));
   }
+
   @Test
   public void testZeroInputParamters() throws Exception {
     analyze(parse("CREATE TEMPORARY MACRO FIXED_NUMBER() 1"));
   }
+
   @Test
   public void testOneInputParamters() throws Exception {
     analyze(parse("CREATE TEMPORARY MACRO SIGMOID (x DOUBLE) 1.0 / (1.0 + EXP(-x))"));
   }
+
   @Test
   public void testTwoInputParamters() throws Exception {
     analyze(parse("CREATE TEMPORARY MACRO DUMB_ADD (x INT, y INT) x + y"));
   }
+
   @Test
   public void testThreeInputParamters() throws Exception {
     analyze(parse("CREATE TEMPORARY MACRO DUMB_ADD (x INT, y INT, z INT) x + y + z"));
   }
+
   @Test(expected = ParseException.class)
   public void testCannotUseReservedWordAsName() throws Exception {
     parse("CREATE TEMPORARY MACRO DOUBLE (x DOUBLE) 1.0 / (1.0 + EXP(-x))");
   }
+
   @Test(expected = ParseException.class)
   public void testNoBody() throws Exception {
     parse("CREATE TEMPORARY MACRO DUMB_MACRO()");
   }
+
   @Test(expected = SemanticException.class)
   public void testUnknownInputParameter() throws Exception {
     analyze(parse("CREATE TEMPORARY MACRO BAD_MACRO (x INT, y INT) x + y + z"));
   }
+
   @Test(expected = SemanticException.class)
   public void testOneUnusedParameterName() throws Exception {
     analyze(parse("CREATE TEMPORARY MACRO BAD_MACRO (x INT, y INT) x"));
   }
+
   @Test(expected = SemanticException.class)
   public void testTwoUnusedParameterNames() throws Exception {
     analyze(parse("CREATE TEMPORARY MACRO BAD_MACRO (x INT, y INT, z INT) x"));
   }
+
   @Test(expected = SemanticException.class)
   public void testTwoDuplicateParameterNames() throws Exception {
     analyze(parse("CREATE TEMPORARY MACRO BAD_MACRO (x INT, x INT) x + x"));
   }
+
   @Test(expected = SemanticException.class)
   public void testThreeDuplicateParameters() throws Exception {
     analyze(parse("CREATE TEMPORARY MACRO BAD_MACRO (x INT, x INT, x INT) x + x + x"));
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/parse/TestSemanticAnalyzerFactory.java b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestSemanticAnalyzerFactory.java
index 1db5a00..620557f 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/parse/TestSemanticAnalyzerFactory.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestSemanticAnalyzerFactory.java
@@ -20,31 +20,32 @@ package org.apache.hadoop.hive.ql.parse;
 import org.junit.Assert;
 
 import org.antlr.runtime.CommonToken;
-import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.hive.ql.QueryState;
+import org.apache.hadoop.hive.ql.ddl.function.createmacro.CreateMacroAnalyzer;
+import org.apache.hadoop.hive.ql.ddl.function.dropmacro.DropMacroAnalyzer;
 import org.junit.Before;
 import org.junit.Test;
 
 public class TestSemanticAnalyzerFactory {
 
   private QueryState queryState;
-  private HiveConf conf;
-  
+
   @Before
   public void setup() throws Exception {
     queryState = new QueryState.Builder().build();
-    conf = queryState.getConf();
   }
+
   @Test
   public void testCreate() throws Exception {
     BaseSemanticAnalyzer analyzer = SemanticAnalyzerFactory.
         get(queryState, new ASTNode(new CommonToken(HiveParser.TOK_CREATEMACRO)));
-    Assert.assertTrue(analyzer.getClass().getSimpleName(), analyzer instanceof MacroSemanticAnalyzer);
+    Assert.assertTrue(analyzer.getClass().getSimpleName(), analyzer instanceof CreateMacroAnalyzer);
   }
+
   @Test
   public void testDrop() throws Exception {
     BaseSemanticAnalyzer analyzer = SemanticAnalyzerFactory.
         get(queryState, new ASTNode(new CommonToken(HiveParser.TOK_DROPMACRO)));
-    Assert.assertTrue(analyzer.getClass().getSimpleName(), analyzer instanceof MacroSemanticAnalyzer);
+    Assert.assertTrue(analyzer.getClass().getSimpleName(), analyzer instanceof DropMacroAnalyzer);
   }
 }
\ No newline at end of file
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestCreateMacroDesc.java b/ql/src/test/org/apache/hadoop/hive/ql/plan/TestCreateMacroDesc.java
index 47849a1..c69a63c 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestCreateMacroDesc.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/plan/TestCreateMacroDesc.java
@@ -21,7 +21,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.junit.Assert;
-import org.apache.hadoop.hive.ql.ddl.function.CreateMacroDesc;
+import org.apache.hadoop.hive.ql.ddl.function.createmacro.CreateMacroDesc;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
 import org.junit.Before;
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java b/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
index 5d553b4..112633f 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/plan/TestDropMacroDesc.java
@@ -17,7 +17,7 @@
  */
 package org.apache.hadoop.hive.ql.plan;
 
-import org.apache.hadoop.hive.ql.ddl.function.DropMacroDesc;
+import org.apache.hadoop.hive.ql.ddl.function.dropmacro.DropMacroDesc;
 import org.junit.Assert;
 
 import org.junit.Before;